{
  "cells": [
  {
   "cell_type": "markdown",
   "id": "b22f597d-ec17-4ab9-8933-28e92af2438d",
   "metadata": {},
   "source": [
    "# DeePMD-kit Quick Start Tutorial"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a41db5f",
   "metadata": {},
   "source": [
    "<a href=\"https://nb.bohrium.dp.tech/detail/52879961357\" target=\"_blank\"><img src=\"https://cdn.dp.tech/bohrium/web/static/images/open-in-bohrium.svg\" alt=\"Open In Bohrium\"/></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85b62e3d-dfae-402f-96a5-5672367d2d17",
   "metadata": {},
   "source": [
    "<div style=\"color:black; background-color:#FFF3E9; border: 1px solid #FFE0C3; border-radius: 10px; margin-bottom:1rem\">\n",
    "    <p style=\"margin:1rem; padding-left: 1rem; line-height: 2.5;\">\n",
    "        ©️ <b><i>Copyright 2024 @ Authors</i></b><br/>\n",
    "        📖 <b>Getting Started Guide</b><br/>\n",
    "        Licensing Agreement: This work is licensed under the <a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nc-sa/4.0/\">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.<br/><br/>\n",
    "       This document can be executed directly on the <a style=\"font-weight:bold; color:rgb(85, 91, 228)\" href=\"https://bohrium-doc.dp.tech/docs/userguide/Notebook\" target=\"_blank\"> Bohrium Notebook</a>. To begin,you can click the  <span style=\"background-color:rgb(85, 91, 228); color:white; padding: 3px; border-radius: 5px;box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.3); font-size:0.75rem;\">Open in Bohrium</span>  button above to quickly run this document in Bohrium. <br/><br/>\n",
    "       After opening Bohrium Notebook, click the button <span style=\"background-color:rgb(85, 91, 228); color:white; padding: 3px; border-radius: 5px;box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.3); font-size:0.75rem;\">connect</span> .We have already set up the recommended image and the recommended machine type for you.\n",
    "    </p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbab8963",
   "metadata": {},
   "source": [
    "**This is a quick start guide for \"Deep Potential\" molecular dynamics using DeePMD-kit, through which you can quickly understand the paradigm cycle that DeePMD-kit operates in and apply it to your projects.**\n",
    "<p>Deep Potential is the convergence of machine learning and physical principles, presenting a new computational paradigm as shown in the figure below.</p>\n",
    "<div style=\"text-align: center;\">\n",
    "    <img src=\"https://bohrium-example.oss-cn-zhangjiakou.aliyuncs.com/notebook/static/mdkit/DPMD1.svg\" alt=\"Fig2\" style=\"zoom: 75%;\">\n",
    "    <p style='font-size:0.8rem; font-weight:bold'>Figure | A new computational paradigm, composed of Molecular Modeling, Machine Learning, and High-Performance Computing (HPC).</p>\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4416190-479c-4b2f-9e08-33690bc4941d",
   "metadata": {},
   "source": [
    "## Task\n",
    "\n",
    "> **Mastering the paradigm cycle of using DeePMD-kit to establish deep potential molecular dynamics models, and following a complete case to learn how to apply it to molecular dynamics tasks.**\n",
    "\n",
    "By the end of this tutorial, you will be able to:\n",
    "\n",
    "* Prepare the formataive dataset and running scripts for training with DeePMD-kit;\n",
    "* Train, freeze, and test DeePMD-kit models;\n",
    "* Use DeePMD-kit in LAMMPS for calculations;\n",
    "\n",
    "Work through this tutorial. It will take you 20 minutes, max!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e6587cb-ba6e-42ba-a139-0595fc7f79d7",
   "metadata": {},
   "source": [
    "\n",
    "```{contents} Table of Contents\n",
    ":depth: 3\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42afcb0e",
   "metadata": {},
   "source": [
    "## Background\n",
    "\n",
    "In this tutorial, we will take the gaseous methane molecule as an example to provide a detailed introduction to the training and application of the Deep Potential (DP) model.\n",
    "\n",
    "DeePMD-kit is a software tool that employs neural networks to fit potential energy models based on first-principles data for molecular dynamics simulations. Without manual intervention, it can end-to-end transform the data provided by users into a deep potential model in a matter of hours. This model can seamlessly integrate with common molecular dynamics simulation software (like LAMMPS, OpenMM, and GROMACS).\n",
    "\n",
    "DeePMD-kit significantly elevates the limits of molecular dynamics through high-performance computing and machine learning, achieving system scales of up to hundreds of millions of atoms while still maintaining the high accuracy of \"ab initio\" calculations. The simulation time scale is improved by at least 1000 times compared to traditional methods. Its achievements earned the 2020 ACM Gordon Bell Prize, one of the highest honors in the field of high-performance computing, and it has been used by over a thousand research groups in physics, chemistry, materials science, biology, and other fields globally.\n",
    "\n",
    "<img src=\"https://bohrium-example.oss-cn-zhangjiakou.aliyuncs.com/notebook/static/mdkit/DPMD_Time_and_Size_Scales.svg\" alt=\"Fig1\" style=\"zoom: 75%;\">\n",
    "\n",
    "For more detailed usage, you can refer to the [DeePMD-kit’s documentation](https://docs.deepmodeling.org/projects/deepmd/en/master/index.html) as a comprehensive reference.\n",
    "\n",
    "In this case, the Deep Potential (DP) model was generated using the **DeePMD-kit package**.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "275d9d23",
   "metadata": {},
   "source": [
    "## Practice"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9be4db1",
   "metadata": {},
   "source": [
    "### Data Preparation\n",
    "\n",
    "We have prepared the initial data for $CH_4$ required to run DeePMD-kit computations and placed it in the `DeePMD-kit_Tutorial` folder. You can view the corresponding files by clicking on the dataset on the left side:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "125c96ef",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset is already downloaded and extracted.\n",
      "Current path is: /personal\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "# Define the dataset URL and the paths\n",
    "dataset_url = \"https://bohrium-api.dp.tech/ds-dl/DeePMD-kit-Tutorial-a8z5-v1.zip\"\n",
    "zip_file_name = \"DeePMD-kit-Tutorial-a8z5-v1.zip\"\n",
    "dataset_directory = \"DeePMD-kit_Tutorial\"\n",
    "local_zip_path = f\"/personal/{zip_file_name}\"\n",
    "extract_path = \"/personal/\"\n",
    "\n",
    "# Check if the dataset directory exists to avoid re-downloading and re-extracting\n",
    "if not os.path.isdir(f\"{extract_path}{dataset_directory}\"):\n",
    "    # Download and extract if not exists\n",
    "    if not os.path.isfile(local_zip_path):\n",
    "        print(\"Downloading dataset...\")\n",
    "        !wget -q -O {local_zip_path} {dataset_url}\n",
    "\n",
    "    print(\"Extracting dataset...\")\n",
    "    !unzip -q -n {local_zip_path} -d {extract_path}\n",
    "else:\n",
    "    print(\"Dataset is already downloaded and extracted.\")\n",
    "\n",
    "# Change the current working directory\n",
    "os.chdir(f\"{extract_path}\")\n",
    "print(f\"Current path is: {os.getcwd()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a265a0d9",
   "metadata": {},
   "source": [
    "Let's take a look at the downloaded DeePMD-kit_Tutorial folder."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2ea12f86",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[01;34mDeePMD-kit_Tutorial\u001b[0m\n",
      "├── \u001b[01;34m00.data\u001b[0m\n",
      "├── \u001b[01;34m01.train\u001b[0m\n",
      "├── \u001b[01;34m01.train.finished\u001b[0m\n",
      "├── \u001b[01;34m02.lmp\u001b[0m\n",
      "└── \u001b[01;34m02.lmp.finished\u001b[0m\n",
      "\n",
      "5 directories, 0 files\n"
     ]
    }
   ],
   "source": [
    "! tree DeePMD-kit_Tutorial -L 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1da4b858",
   "metadata": {},
   "source": [
    "There are 3 subfolders under the DeePMD-kit_Tutorial folder: 00.data, 01.train, and 02.lmp.\n",
    "\n",
    "- The 00.data folder is used to store training and testing data.\n",
    "- The 01.train folder contains example scripts for training models using DeePMD-kit.\n",
    "- The 01.train.finished folder includes the complete results of the training process.\n",
    "- The 02.lmp folder contains example scripts for molecular dynamics simulations using LAMMPS.\n",
    "\n",
    "Let's first take a look at the DeePMD-kit_Tutorial/00.data folder."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "509f7efe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[01;34mDeePMD-kit_Tutorial/00.data\u001b[0m\n",
      "├── \u001b[01;34mabacus_md\u001b[0m\n",
      "├── \u001b[01;34mtraining_data\u001b[0m\n",
      "└── \u001b[01;34mvalidation_data\u001b[0m\n",
      "\n",
      "3 directories, 0 files\n"
     ]
    }
   ],
   "source": [
    "! tree DeePMD-kit_Tutorial/00.data -L 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8373a3a4",
   "metadata": {},
   "source": [
    "DeePMD-kit's training data originates from first-principles calculation data, including atomic types, simulation cells, atomic coordinates, atomic forces, system energies, and virials.\n",
    "\n",
    "<div align=\"left\" style=\"margin:1.5rem\"><img src=\"https://ars.els-cdn.com/content/image/1-s2.0-S0010465518300882-gr1_lrg.jpg\" alt=\"image-20230116161737203\" style=\"zoom: 25%;\"></div>\n",
    "\n",
    "In the *00.data* folder, there is only the *abacus_md* folder, which contains data obtained through *ab initio* Molecular Dynamics (AIMD) simulations using ABACUS. In this tutorial, we have already completed the *ab initio* molecular dynamics calculations for the methane molecule for you.\n",
    "\n",
    "Detailed information about ABACUS can be found in its [documentation](https://abacus.deepmodeling.com/en/latest/). \n",
    "\n",
    "DeePMD-kit uses a compressed data format. All training data should first be converted into this format before they can be used in DeePMD-kit. This data format is explained in detail in the DeePMD-kit manual, which can be found on [DeePMD-kit's GitHub](http://www.github.com/deepmodeling/deepmd-kit).\n",
    "\n",
    "We provide a convenient tool **dpdata**, which can convert data generated by VASP, CP2K, Gaussian, Quantum Espresso, ABACUS, and LAMMPS into DeePMD-kit's compressed format.\n",
    "\n",
    "A snapshot of a molecular system that contains computational data information is called a frame. A data system comprises many frames sharing the same number of atoms and atom types.\n",
    "\n",
    "For example, a molecular dynamics trajectory can be converted into a data system, where each timestep corresponds to one frame in the system.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e62f0115",
   "metadata": {},
   "source": [
    "Next, we use the dpdata tool to randomly split the data in abacus_md into training and validation data.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b5fbc838",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# the data contains 201 frames\n",
      "# the training data contains 161 frames\n",
      "# the validation data contains 40 frames\n"
     ]
    }
   ],
   "source": [
    "import dpdata\n",
    "import numpy as np\n",
    "\n",
    "# load data of abacus/md format\n",
    "data = dpdata.LabeledSystem(\"DeePMD-kit_Tutorial/00.data/abacus_md\", fmt=\"abacus/md\")\n",
    "print(\"# the data contains %d frames\" % len(data))\n",
    "\n",
    "# random choose 40 index for validation_data\n",
    "rng = np.random.default_rng()\n",
    "index_validation = rng.choice(201, size=40, replace=False)\n",
    "\n",
    "# other indexes are training_data\n",
    "index_training = list(set(range(201)) - set(index_validation))\n",
    "data_training = data.sub_system(index_training)\n",
    "data_validation = data.sub_system(index_validation)\n",
    "\n",
    "# all training data put into directory:\"training_data\"\n",
    "data_training.to_deepmd_npy(\"DeePMD-kit_Tutorial/00.data/training_data\")\n",
    "\n",
    "# all validation data put into directory:\"validation_data\"\n",
    "data_validation.to_deepmd_npy(\"DeePMD-kit_Tutorial/00.data/validation_data\")\n",
    "\n",
    "print(\"# the training data contains %d frames\" % len(data_training))\n",
    "print(\"# the validation data contains %d frames\" % len(data_validation))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98719865-ab3d-4440-8c14-78a1c253c3a6",
   "metadata": {},
   "source": [
    "As you can see, 161 frames are picked as training data, and the other 40 frames are validation dat.\n",
    "\n",
    "Let's take another look at the 00.data folder, where new files have been generated, which are the training and validation sets required for Deep Potential training with DeePMD-kit.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e5befaf5-c464-4e8f-8544-a2634f5fd1d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[01;34mDeePMD-kit_Tutorial/00.data/\u001b[0m\n",
      "├── \u001b[01;34mabacus_md\u001b[0m\n",
      "├── \u001b[01;34mtraining_data\u001b[0m\n",
      "└── \u001b[01;34mvalidation_data\u001b[0m\n",
      "\n",
      "3 directories, 0 files\n"
     ]
    }
   ],
   "source": [
    "! tree DeePMD-kit_Tutorial/00.data/ -L 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "70cc9898",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[01;34mDeePMD-kit_Tutorial/00.data/training_data\u001b[0m\n",
      "├── \u001b[01;34mset.000\u001b[0m\n",
      "├── \u001b[00mtype.raw\u001b[0m\n",
      "└── \u001b[00mtype_map.raw\u001b[0m\n",
      "\n",
      "1 directory, 2 files\n"
     ]
    }
   ],
   "source": [
    "! tree DeePMD-kit_Tutorial/00.data/training_data -L 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "542b24fd",
   "metadata": {},
   "source": [
    "The functions of these files are as follows:\n",
    "\n",
    "- set.000: It is a directory that contains compressed format data (NumPy compressed arrays).\n",
    "- type.raw: It is a file that contains the types of atoms (represented as integers).\n",
    "- type_map.raw: It is a file that contains the names of the types of atoms.\n",
    "\n",
    "Let's take a look at these files."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99770e51-4d9e-44db-bb93-1c7061c8862c",
   "metadata": {},
   "source": [
    "Let's have a look at `type.raw`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a686585c-3e5b-4a5c-9cc7-4db7759b74b2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "0\n",
      "0\n",
      "0\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "! cat DeePMD-kit_Tutorial/00.data/training_data/type.raw"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5357cc5-9cdd-4c52-a611-a84cee739fb0",
   "metadata": {},
   "source": [
    "This tells us there are 5 atoms in this example, 4 atoms represented by type \"0\", and 1 atom represented by type \"1\".\n",
    "Sometimes one needs to map the integer types to atom name. The mapping can be given by the file `type_map.raw`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6216f02d-3a21-481f-99da-3f23b438a7c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "H\n",
      "C\n"
     ]
    }
   ],
   "source": [
    "! cat DeePMD-kit_Tutorial/00.data/training_data/type_map.raw"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1196aa0f-22c5-4b96-8640-c82068fa7828",
   "metadata": {},
   "source": [
    "This tells us the type \"0\" is named by \"H\", and the type \"1\" is named by \"C\".\n",
    "\n",
    "More detailed documentation on using dpdata for data conversion can be found [here](../data/data-conv.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac6c969b-10cb-49f0-9b84-7dc9ffa38c61",
   "metadata": {},
   "source": [
    "### Prepare input script\n",
    "Once the data preparation is done, we can go on with training. Now go to the training directory.\n",
    "DeePMD-kit requires a `json` format file to specify parameters for training. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "749c24f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Check dargs version and Install\n",
    "!pip show dargs || pip install --upgrade dargs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "995c0b91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".dargs-codeblock {\n",
       "  width: 100%;\n",
       "  background-color: #f9f9f9;\n",
       "  border-color: #f9f9f9;\n",
       "  color: #000000;\n",
       "}\n",
       ".dargs-codeblock::before {\n",
       "  counter-reset: listing;\n",
       "}\n",
       ".dargs-codeblock code.dargs-linebegin {\n",
       "  counter-increment: listing;\n",
       "}\n",
       ".dargs-codeblock code.dargs-linebegin::before {\n",
       "  content: counter(listing) \" \";\n",
       "  display: inline-block;\n",
       "  width: 2em;\n",
       "  padding-left: auto;\n",
       "  margin-left: auto;\n",
       "  text-align: right;\n",
       "  color: #6e7781;\n",
       "}\n",
       ".dargs-codeblock code.dargs-code {\n",
       "  padding-left: 0;\n",
       "  padding-right: 0;\n",
       "  margin-left: 0;\n",
       "  margin-right: 0;\n",
       "  background-color: #f9f9f9;\n",
       "  border-color: #f9f9f9;\n",
       "  color: #000000;\n",
       "}\n",
       ".dargs-codeblock .dargs-key {\n",
       "  position: relative;\n",
       "  display: inline-block;\n",
       "  border-bottom: 1px dotted black;\n",
       "}\n",
       ".dargs-codeblock .dargs-key code.dargs-code {\n",
       "  color: #0550ae;\n",
       "}\n",
       ".dargs-codeblock .dargs-key .dargs-doc {\n",
       "  visibility: hidden;\n",
       "  width: 600px;\n",
       "  background-color: black;\n",
       "  color: #fff;\n",
       "  padding: 1em 1em;\n",
       "  border-radius: 6px;\n",
       "  position: absolute;\n",
       "  z-index: 1;\n",
       "}\n",
       ".dargs-codeblock .dargs-key:hover .dargs-doc {\n",
       "  visibility: visible;\n",
       "}\n",
       ".dargs-codeblock .dargs-key .dargs-doc .dargs-doc-code {\n",
       "  color: #bbbbff;\n",
       "}\n",
       "</style>\n",
       "<div class=\"dargs-codeblock\"><code class=\"dargs-code dargs-linebegin\"></code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"that's all\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"model\"</code><span class=\"dargs-doc\">model: <br/>    type: <span class=\"dargs-doc-code\">dict</span></span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"type_map\"</code><span class=\"dargs-doc\">type_map: <br/>    type: <span class=\"dargs-doc-code\">typing.list[str]</span>, optional<hr/>A list of strings. Give the name to each type of atoms. It is noted that the number of atom type of training system must be less than 128 in a GPU environment. If not given, type.raw in each system should use the same type indexes, and type_map.raw will take no effect.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">[<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code>  \"H\",<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code>  \"C\"<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code>],</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"descriptor\"</code><span class=\"dargs-doc\">descriptor: <br/>    type: <span class=\"dargs-doc-code\">dict</span><hr/>The descriptor of atomic environment.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"type\"</code><span class=\"dargs-doc\">type:<br/>type: <span class=\"dargs-doc-code\">str</span><hr/>The type of the descriptor. See explanation below. <br/>- <span class=\"dargs-doc-code\">loc_frame</span>: Defines a local frame at each atom, and the compute the descriptor as local coordinates under this frame.<br/>- <span class=\"dargs-doc-code\">se_e2_a</span>: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor.<br/>- <span class=\"dargs-doc-code\">se_e2_r</span>: Used by the smooth edition of Deep Potential. Only the distance between atoms is used to construct the descriptor.<br/>- <span class=\"dargs-doc-code\">se_e3</span>: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Three-body embedding will be used by this descriptor.<br/>- <span class=\"dargs-doc-code\">se_a_tpe</span>: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Type embedding will be used by this descriptor.<br/>- <span class=\"dargs-doc-code\">se_atten</span>: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Attention mechanism will be used by this descriptor.<br/>- <span class=\"dargs-doc-code\">se_atten_v2</span>: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Attention mechanism with new modifications will be used by this descriptor.<br/>- <span class=\"dargs-doc-code\">se_a_mask</span>: Used by the smooth edition of Deep Potential. It can accept a variable number of atoms in a frame (Non-PBC system). <i>aparam</i> are required as an indicator matrix for the real/virtual sign of input atoms. <br/>- <span class=\"dargs-doc-code\">hybrid</span>: Concatenate of a list of descriptors as a new descriptor.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"se_e2_a\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"sel\"</code><span class=\"dargs-doc\">sel: <br/>    type: <span class=\"dargs-doc-code\">str</span> | <span class=\"dargs-doc-code\">typing.list[int]</span>, optional, default: <span class=\"dargs-doc-code\">auto</span><hr/>This parameter set the number of selected neighbors for each type of atom. It can be:<br/>    - <span class=\"dargs-doc-code\">list[int]</span>. The length of the list should be the same as the number of atom types in the system. <span class=\"dargs-doc-code\">sel[i]</span> gives the selected number of type-i neighbors. <span class=\"dargs-doc-code\">sel[i]</span> is recommended to be larger than the maximally possible number of type-i neighbors in the cut-off radius. It is noted that the total sel value must be less than 4096 in a GPU environment.<br/>    - <span class=\"dargs-doc-code\">str</span>. Can be \"auto:factor\" or \"auto\". \"factor\" is a float number larger than 1. This option will automatically determine the <span class=\"dargs-doc-code\">sel</span>. In detail it counts the maximal number of neighbors with in the cutoff radius for each type of neighbor, then multiply the maximum by the \"factor\". Finally the number is wraped up to 4 divisible. The option \"auto\" is equivalent to \"auto:1.1\".</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"auto\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"rcut_smth\"</code><span class=\"dargs-doc\">rcut_smth: <br/>    type: <span class=\"dargs-doc-code\">float</span>, optional, default: <span class=\"dargs-doc-code\">0.5</span><hr/>Where to start smoothing. For example the 1/r term is smoothed from <span class=\"dargs-doc-code\">rcut</span> to <span class=\"dargs-doc-code\">rcut_smth</span></span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">0.5,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"rcut\"</code><span class=\"dargs-doc\">rcut: <br/>    type: <span class=\"dargs-doc-code\">float</span>, optional, default: <span class=\"dargs-doc-code\">6.0</span><hr/>The cut-off radius.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">6.0,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"neuron\"</code><span class=\"dargs-doc\">neuron: <br/>    type: <span class=\"dargs-doc-code\">typing.list[int]</span>, optional, default: <span class=\"dargs-doc-code\">[10, 20, 40]</span><hr/>Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">[<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  25,<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  50,<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  100<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>],</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"resnet_dt\"</code><span class=\"dargs-doc\">resnet_dt: <br/>    type: <span class=\"dargs-doc-code\">bool</span>, optional, default: <span class=\"dargs-doc-code\">False</span><hr/>Whether to use a \"Timestep\" in the skip connection</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">false,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"axis_neuron\"</code><span class=\"dargs-doc\">axis_neuron: <br/>    type: <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">4</span>, alias: <i>n_axis_neuron</i><hr/>Size of the submatrix of G (embedding matrix).</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">16,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"seed\"</code><span class=\"dargs-doc\">seed: <br/>    type: <span class=\"dargs-doc-code\">NoneType</span> | <span class=\"dargs-doc-code\">int</span>, optional<hr/>Random seed for parameter initialization</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\" that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"fitting_net\"</code><span class=\"dargs-doc\">fitting_net: <br/>    type: <span class=\"dargs-doc-code\">dict</span><hr/>The fitting of physical properties.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"neuron\"</code><span class=\"dargs-doc\">neuron: <br/>    type: <span class=\"dargs-doc-code\">typing.list[int]</span>, optional, default: <span class=\"dargs-doc-code\">[120, 120, 120]</span>, alias: <i>n_neuron</i><hr/>The number of neurons in each hidden layers of the fitting net. When two hidden layers are of the same size, a skip connection is built.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">[<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  240,<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  240,<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  240<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>],</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"resnet_dt\"</code><span class=\"dargs-doc\">resnet_dt: <br/>    type: <span class=\"dargs-doc-code\">bool</span>, optional, default: <span class=\"dargs-doc-code\">True</span><hr/>Whether to use a \"Timestep\" in the skip connection</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">true,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"seed\"</code><span class=\"dargs-doc\">seed: <br/>    type: <span class=\"dargs-doc-code\">NoneType</span> | <span class=\"dargs-doc-code\">int</span>, optional<hr/>Random seed for parameter initialization of the fitting net</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\" that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\" that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"learning_rate\"</code><span class=\"dargs-doc\">learning_rate: <br/>    type: <span class=\"dargs-doc-code\">dict</span>, optional<hr/>The definition of learning rate</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"type\"</code><span class=\"dargs-doc\">type:<br/>type: <span class=\"dargs-doc-code\">str</span>, default: <span class=\"dargs-doc-code\">exp</span><hr/>The type of the learning rate.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"exp\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"decay_steps\"</code><span class=\"dargs-doc\">decay_steps: <br/>    type: <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">5000</span><hr/>The learning rate is decaying every this number of training steps.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">50,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"start_lr\"</code><span class=\"dargs-doc\">start_lr: <br/>    type: <span class=\"dargs-doc-code\">float</span>, optional, default: <span class=\"dargs-doc-code\">0.001</span><hr/>The learning rate at the start of the training.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">0.001,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"stop_lr\"</code><span class=\"dargs-doc\">stop_lr: <br/>    type: <span class=\"dargs-doc-code\">float</span>, optional, default: <span class=\"dargs-doc-code\">1e-08</span><hr/>The desired learning rate at the end of the training.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">3.51e-08,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"loss\"</code><span class=\"dargs-doc\">loss: <br/>    type: <span class=\"dargs-doc-code\">dict</span>, optional<hr/>The definition of loss function. The loss type should be set to <span class=\"dargs-doc-code\">tensor</span>, <span class=\"dargs-doc-code\">ener</span> or left unset.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"type\"</code><span class=\"dargs-doc\">type:<br/>type: <span class=\"dargs-doc-code\">str</span>, default: <span class=\"dargs-doc-code\">ener</span><hr/>The type of the loss. When the fitting type is <span class=\"dargs-doc-code\">ener</span>, the loss type should be set to <span class=\"dargs-doc-code\">ener</span> or left unset. When the fitting type is <span class=\"dargs-doc-code\">dipole</span> or <span class=\"dargs-doc-code\">polar</span>, the loss type should be set to <span class=\"dargs-doc-code\">tensor</span>.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"ener\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"start_pref_e\"</code><span class=\"dargs-doc\">start_pref_e: <br/>    type: <span class=\"dargs-doc-code\">float</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">0.02</span><hr/>The prefactor of energy loss at the start of the training. Should be larger than or equal to 0. If set to none-zero value, the energy label should be provided by file energy.npy in each data system. If both start_pref_e and limit_pref_e are set to 0, then the energy will be ignored.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">0.02,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"limit_pref_e\"</code><span class=\"dargs-doc\">limit_pref_e: <br/>    type: <span class=\"dargs-doc-code\">float</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">1.0</span><hr/>The prefactor of energy loss at the limit of the training, Should be larger than or equal to 0. i.e. the training step goes to infinity.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"start_pref_f\"</code><span class=\"dargs-doc\">start_pref_f: <br/>    type: <span class=\"dargs-doc-code\">float</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">1000</span><hr/>The prefactor of force loss at the start of the training. Should be larger than or equal to 0. If set to none-zero value, the force label should be provided by file force.npy in each data system. If both start_pref_f and limit_pref_f are set to 0, then the force will be ignored.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1000,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"limit_pref_f\"</code><span class=\"dargs-doc\">limit_pref_f: <br/>    type: <span class=\"dargs-doc-code\">float</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">1.0</span><hr/>The prefactor of force loss at the limit of the training, Should be larger than or equal to 0. i.e. the training step goes to infinity.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"start_pref_v\"</code><span class=\"dargs-doc\">start_pref_v: <br/>    type: <span class=\"dargs-doc-code\">float</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">0.0</span><hr/>The prefactor of virial loss at the start of the training. Should be larger than or equal to 0. If set to none-zero value, the virial label should be provided by file virial.npy in each data system. If both start_pref_v and limit_pref_v are set to 0, then the virial will be ignored.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">0,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"limit_pref_v\"</code><span class=\"dargs-doc\">limit_pref_v: <br/>    type: <span class=\"dargs-doc-code\">float</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">0.0</span><hr/>The prefactor of virial loss at the limit of the training, Should be larger than or equal to 0. i.e. the training step goes to infinity.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">0,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\" that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"training\"</code><span class=\"dargs-doc\">training: <br/>    type: <span class=\"dargs-doc-code\">dict</span><hr/>The training options.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"training_data\"</code><span class=\"dargs-doc\">training_data: <br/>    type: <span class=\"dargs-doc-code\">dict</span>, optional<hr/>Configurations of training data.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"systems\"</code><span class=\"dargs-doc\">systems: <br/>    type: <span class=\"dargs-doc-code\">str</span> | <span class=\"dargs-doc-code\">typing.list[str]</span><hr/>The data systems for training. This key can be provided with a list that specifies the systems, or be provided with a string by which the prefix of all systems are given and the list of the systems is automatically generated.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">[<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  \"../00.data/training_data\"<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>],</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"batch_size\"</code><span class=\"dargs-doc\">batch_size: <br/>    type: <span class=\"dargs-doc-code\">str</span> | <span class=\"dargs-doc-code\">typing.list[int]</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">auto</span><hr/>This key can be <br/>- list: the length of which is the same as the <span class=\"dargs-doc-code\">systems</span>_. The batch size of each system is given by the elements of the list.<br/>- int: all <span class=\"dargs-doc-code\">systems</span>_ use the same batch size.<br/>- string \"auto\": automatically determines the batch size so that the batch_size times the number of atoms in the system is no less than 32.<br/>- string \"auto:N\": automatically determines the batch size so that the batch_size times the number of atoms in the system is no less than N.<br/>- string \"mixed:N\": the batch data will be sampled from all systems and merged into a mixed system with the batch size N. Only support the se_atten descriptor.<br/>If MPI is used, the value should be considered as the batch size per task.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"auto\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"validation_data\"</code><span class=\"dargs-doc\">validation_data: <br/>    type: <span class=\"dargs-doc-code\">NoneType</span> | <span class=\"dargs-doc-code\">dict</span>, optional, default: <span class=\"dargs-doc-code\">None</span><hr/>Configurations of validation data. Similar to that of training data, except that a <span class=\"dargs-doc-code\">numb_btch</span> argument may be configured</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">{</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"systems\"</code><span class=\"dargs-doc\">systems: <br/>    type: <span class=\"dargs-doc-code\">str</span> | <span class=\"dargs-doc-code\">typing.list[str]</span><hr/>The data systems for validation. This key can be provided with a list that specifies the systems, or be provided with a string by which the prefix of all systems are given and the list of the systems is automatically generated.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">[<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>  \"../00.data/validation_data\"<br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>],</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"batch_size\"</code><span class=\"dargs-doc\">batch_size: <br/>    type: <span class=\"dargs-doc-code\">str</span> | <span class=\"dargs-doc-code\">typing.list[int]</span> | <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">auto</span><hr/>This key can be <br/>- list: the length of which is the same as the <span class=\"dargs-doc-code\">systems</span>_. The batch size of each system is given by the elements of the list.<br/>- int: all <span class=\"dargs-doc-code\">systems</span>_ use the same batch size.<br/>- string \"auto\": automatically determines the batch size so that the batch_size times the number of atoms in the system is no less than 32.<br/>- string \"auto:N\": automatically determines the batch size so that the batch_size times the number of atoms in the system is no less than N.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"auto\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"numb_btch\"</code><span class=\"dargs-doc\">numb_btch: <br/>    type: <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">1</span>, alias: <i>numb_batch</i><hr/>An integer that specifies the number of batches to be sampled for each validation period.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class=\"dargs-code\">},</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"numb_steps\"</code><span class=\"dargs-doc\">numb_steps: <br/>    type: <span class=\"dargs-doc-code\">int</span>, alias: <i>stop_batch</i><hr/>Number of training batch. Each training uses one batch of data.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">10000,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"seed\"</code><span class=\"dargs-doc\">seed: <br/>    type: <span class=\"dargs-doc-code\">NoneType</span> | <span class=\"dargs-doc-code\">int</span>, optional<hr/>The random seed for getting frames from the training data set.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">10,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"disp_file\"</code><span class=\"dargs-doc\">disp_file: <br/>    type: <span class=\"dargs-doc-code\">str</span>, optional, default: <span class=\"dargs-doc-code\">lcurve.out</span><hr/>The file for printing learning curve.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"lcurve.out\",</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"disp_freq\"</code><span class=\"dargs-doc\">disp_freq: <br/>    type: <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">1000</span><hr/>The frequency of printing learning curve.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">200,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span class=\"dargs-key\"><code class=\"dargs-code\">\"save_freq\"</code><span class=\"dargs-doc\">save_freq: <br/>    type: <span class=\"dargs-doc-code\">int</span>, optional, default: <span class=\"dargs-doc-code\">1000</span><hr/>The frequency of saving check point.</span></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">1000,</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;&nbsp;&nbsp;</code><span><code class=\"dargs-code\">\"_comment\"</code></span><code class=\"dargs-code\">: </code><code class=\"dargs-code\">\"that's all\"</code><br/><code class=\"dargs-code dargs-linebegin\">&nbsp;&nbsp;</code><code class=\"dargs-code\">}</code><br/><code class=\"dargs-code dargs-linebegin\"></code><code class=\"dargs-code\">}</code><br/></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Show input.json\n",
    "from deepmd.utils.argcheck import gen_args\n",
    "from dargs.notebook import JSON\n",
    "\n",
    "with open(\"./DeePMD-kit_Tutorial/01.train/input.json\") as f:\n",
    "    JSON(f.read(), gen_args())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a4c680a-abcf-40b9-b00e-fa4615aa91b9",
   "metadata": {},
   "source": [
    "DeePMD-kit requires a `json` format file to specify parameters for training. \n",
    "\n",
    "In the model section, the parameters of embedding and fitting networks are specified.\n",
    "```json\n",
    "\"model\":{\n",
    "    \"type_map\":    [\"H\", \"C\"],                 \n",
    "    \"descriptor\":{\n",
    "        \"type\":            \"se_e2_a\",          \n",
    "        \"rcut\":            6.00,               \n",
    "        \"rcut_smth\":       0.50,               \n",
    "        \"sel\":             \"auto\",             \n",
    "        \"neuron\":          [25, 50, 100],       \n",
    "        \"resnet_dt\":       false,\n",
    "        \"axis_neuron\":     16,                  \n",
    "        \"seed\":            1,\n",
    "        \"_comment\":        \"that's all\"\n",
    "        },\n",
    "    \"fitting_net\":{\n",
    "        \"neuron\":          [240, 240, 240],    \n",
    "        \"resnet_dt\":       true,\n",
    "        \"seed\":            1,\n",
    "        \"_comment\":        \"that's all\"\n",
    "    },\n",
    "    \"_comment\":    \"that's all\"'\n",
    "},\n",
    "```\n",
    "The explanation for some of the parameters is as follows:\n",
    "\n",
    "| Parameter                | Expiation                                                    |\n",
    "| ------------------------ | ------------------------------------------------------------ |\n",
    "| type_map                 | *the* *name* *of* *each* *type* *of* *atom*                  |\n",
    "| descriptor > type        | *the* *type* *of* *descriptor*                               |\n",
    "| descriptor > rcut        | *cut-off* *radius*                                           |\n",
    "| descriptor > rcut_smth   | *where* *the* *smoothing* *starts*                           |\n",
    "| descriptor > sel         | *the* *maximum* *number* *of* *type* *i* *atoms* *in* *the* *cut-off* *radius* |\n",
    "| descriptor > neuron      | *size* *of* *the* *embedding* *neural* *network*             |\n",
    "| descriptor > axis_neuron | *the* *size* *of* *the* *submatrix* *of* *G* *(embedding* *matrix)* |\n",
    "| fitting_net > neuron     | *size* *of* *the* *fitting* *neural* *network*               |\n",
    "\n",
    "The `se_e2_a` descriptor is used to train the DP model. The item neurons set the size of the descriptors and fitting network to [25, 50, 100] and [240, 240, 240], respectively. The components in local environment to smoothly go to zero from 0.5 to 6 Å.\n",
    "\n",
    "The following are the parameters that specify the learning rate and loss function.\n",
    "```json\n",
    "    \"learning_rate\" :{\n",
    "        \"type\":                \"exp\",\n",
    "        \"decay_steps\":         50,\n",
    "        \"start_lr\":            0.001,    \n",
    "        \"stop_lr\":             3.51e-8,\n",
    "        \"_comment\":            \"that's all\"\n",
    "    },\n",
    "    \"loss\" :{\n",
    "        \"type\":                \"ener\",\n",
    "        \"start_pref_e\":        0.02,\n",
    "        \"limit_pref_e\":        1,\n",
    "        \"start_pref_f\":        1000,\n",
    "        \"limit_pref_f\":        1,\n",
    "        \"start_pref_v\":        0,\n",
    "        \"limit_pref_v\":        0,\n",
    "        \"_comment\":            \"that's all\"\n",
    "    },\n",
    "```\n",
    "In the loss function, `pref_e` increases from 0.02 to 1, and `pref_f` decreases from 1000 to 1  progressively, which means that the force term dominates at the beginning, while energy and virial terms become important at the end. This strategy is very effective and reduces the total training time. `pref_v` is set to 0 , indicating that no virial data are included in the training process. The starting learning rate, stop learning rate, and decay steps are set to 0.001, 3.51e-8, and 50, respectively. The model is trained for 10000 steps.\n",
    "\n",
    "The training parameters are given in the following\n",
    "```json\n",
    "    \"training\" : {\n",
    "        \"training_data\": {\n",
    "            \"systems\":            [\"../00.data/training_data\"],     \n",
    "            \"batch_size\":         \"auto\",                       \n",
    "            \"_comment\":           \"that's all\"\n",
    "        },\n",
    "        \"validation_data\":{\n",
    "            \"systems\":            [\"../00.data/validation_data/\"],\n",
    "            \"batch_size\":         \"auto\",               \n",
    "            \"numb_btch\":          1,\n",
    "            \"_comment\":           \"that's all\"\n",
    "        },\n",
    "        \"numb_steps\":             10000,                           \n",
    "        \"seed\":                   10,\n",
    "        \"disp_file\":              \"lcurve.out\",\n",
    "        \"disp_freq\":              200,\n",
    "        \"save_freq\":              10000,\n",
    "        },\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b0edb0f-df47-4e6c-8c37-5f32c4bd6b39",
   "metadata": {},
   "source": [
    "More detailed docs about Data conversion can be found [here](https://docs.deepmodeling.org/projects/deepmd/en/master/data/data-conv.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bafe20b8-3bde-403c-ae42-b68ba5f29703",
   "metadata": {},
   "source": [
    "### Train a model\n",
    "After the training script is prepared, we can start the training with DeePMD-kit by simply running"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "e04a05a3-ccac-474b-bc24-58fbf20b9ffe",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/compat/v2_compat.py:107: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n",
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "DEEPMD INFO    Calculate neighbor statistics... (add --skip-neighbor-stat to skip this step)\n",
      "DEEPMD INFO    training data with min nbor dist: 1.0460506586976848\n",
      "DEEPMD INFO    training data with max nbor size: [4 1]\n",
      "DEEPMD INFO     _____               _____   __  __  _____           _     _  _   \n",
      "DEEPMD INFO    |  __ \\             |  __ \\ |  \\/  ||  __ \\         | |   (_)| |  \n",
      "DEEPMD INFO    | |  | |  ___   ___ | |__) || \\  / || |  | | ______ | | __ _ | |_ \n",
      "DEEPMD INFO    | |  | | / _ \\ / _ \\|  ___/ | |\\/| || |  | ||______|| |/ /| || __|\n",
      "DEEPMD INFO    | |__| ||  __/|  __/| |     | |  | || |__| |        |   < | || |_ \n",
      "DEEPMD INFO    |_____/  \\___| \\___||_|     |_|  |_||_____/         |_|\\_\\|_| \\__|\n",
      "DEEPMD INFO    Please read and cite:\n",
      "DEEPMD INFO    Wang, Zhang, Han and E, Comput.Phys.Comm. 228, 178-184 (2018)\n",
      "DEEPMD INFO    Zeng et al, J. Chem. Phys., 159, 054801 (2023)\n",
      "DEEPMD INFO    See https://deepmd.rtfd.io/credits/ for details.\n",
      "DEEPMD INFO    installed to:         /root/miniconda3/envs/deepmd\n",
      "DEEPMD INFO    source :              v2.2.7\n",
      "DEEPMD INFO    source branch:         HEAD\n",
      "DEEPMD INFO    source commit:        839f4fe7\n",
      "DEEPMD INFO    source commit at:     2023-10-27 21:10:24 +0800\n",
      "DEEPMD INFO    build float prec:     double\n",
      "DEEPMD INFO    build variant:        cpu\n",
      "DEEPMD INFO    build with tf inc:    /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/include;/root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/../../../../include\n",
      "DEEPMD INFO    build with tf lib:    \n",
      "DEEPMD INFO    ---Summary of the training---------------------------------------\n",
      "DEEPMD INFO    running on:           bohrium-21213-1088639\n",
      "DEEPMD INFO    computing device:     cpu:0\n",
      "DEEPMD INFO    Count of visible GPU: 0\n",
      "DEEPMD INFO    num_intra_threads:    0\n",
      "DEEPMD INFO    num_inter_threads:    0\n",
      "DEEPMD INFO    -----------------------------------------------------------------\n",
      "DEEPMD INFO    ---Summary of DataSystem: training     -----------------------------------------------\n",
      "DEEPMD INFO    found 1 system(s):\n",
      "DEEPMD INFO                                        system  natoms  bch_sz   n_bch   prob  pbc\n",
      "DEEPMD INFO                      ../00.data/training_data       5       7      23  1.000    T\n",
      "DEEPMD INFO    --------------------------------------------------------------------------------------\n",
      "DEEPMD INFO    ---Summary of DataSystem: validation   -----------------------------------------------\n",
      "DEEPMD INFO    found 1 system(s):\n",
      "DEEPMD INFO                                        system  natoms  bch_sz   n_bch   prob  pbc\n",
      "DEEPMD INFO                    ../00.data/validation_data       5       7       5  1.000    T\n",
      "DEEPMD INFO    --------------------------------------------------------------------------------------\n",
      "DEEPMD INFO    training without frame parameter\n",
      "DEEPMD INFO    data stating... (this step may take long time)\n",
      "DEEPMD INFO    built lr\n",
      "DEEPMD INFO    built network\n",
      "DEEPMD INFO    built training\n",
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "DEEPMD INFO    initialize model from scratch\n",
      "DEEPMD INFO    start training at lr 1.00e-03 (== 1.00e-03), decay_step 50, decay_rate 0.950006, final lr will be 3.51e-08\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/train/trainer.py:1197: py_func (from tensorflow.python.ops.script_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "tf.py_func is deprecated in TF V2. Instead, there are two\n",
      "    options available in V2.\n",
      "    - tf.py_function takes a python function which manipulates tf eager\n",
      "    tensors instead of numpy arrays. It's easy to convert a tf eager tensor to\n",
      "    an ndarray (just call tensor.numpy()) but having access to eager tensors\n",
      "    means `tf.py_function`s can use accelerators such as GPUs as well as\n",
      "    being differentiable using a gradient tape.\n",
      "    - tf.numpy_function maintains the semantics of the deprecated tf.py_func\n",
      "    (it is not differentiable, and manipulates numpy arrays). It drops the\n",
      "    stateful argument making all functions stateful.\n",
      "    \n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/train/trainer.py:1197: py_func (from tensorflow.python.ops.script_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "tf.py_func is deprecated in TF V2. Instead, there are two\n",
      "    options available in V2.\n",
      "    - tf.py_function takes a python function which manipulates tf eager\n",
      "    tensors instead of numpy arrays. It's easy to convert a tf eager tensor to\n",
      "    an ndarray (just call tensor.numpy()) but having access to eager tensors\n",
      "    means `tf.py_function`s can use accelerators such as GPUs as well as\n",
      "    being differentiable using a gradient tape.\n",
      "    - tf.numpy_function maintains the semantics of the deprecated tf.py_func\n",
      "    (it is not differentiable, and manipulates numpy arrays). It drops the\n",
      "    stateful argument making all functions stateful.\n",
      "    \n",
      "DEEPMD INFO    batch     200 training time 17.53 s, testing time 0.05 s, total wall time 18.41 s\n",
      "DEEPMD INFO    batch     400 training time 14.96 s, testing time 0.05 s, total wall time 15.11 s\n",
      "DEEPMD INFO    batch     600 training time 15.47 s, testing time 0.05 s, total wall time 15.65 s\n",
      "DEEPMD INFO    batch     800 training time 14.25 s, testing time 0.04 s, total wall time 14.41 s\n",
      "DEEPMD INFO    batch    1000 training time 15.49 s, testing time 0.05 s, total wall time 15.65 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    1200 training time 16.33 s, testing time 0.08 s, total wall time 17.33 s\n",
      "DEEPMD INFO    batch    1400 training time 14.31 s, testing time 0.05 s, total wall time 14.47 s\n",
      "DEEPMD INFO    batch    1600 training time 16.54 s, testing time 0.05 s, total wall time 16.72 s\n",
      "DEEPMD INFO    batch    1800 training time 16.90 s, testing time 0.09 s, total wall time 17.09 s\n",
      "DEEPMD INFO    batch    2000 training time 17.20 s, testing time 0.06 s, total wall time 17.37 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    2200 training time 14.29 s, testing time 0.04 s, total wall time 14.83 s\n",
      "DEEPMD INFO    batch    2400 training time 13.11 s, testing time 0.04 s, total wall time 13.29 s\n",
      "DEEPMD INFO    batch    2600 training time 12.93 s, testing time 0.04 s, total wall time 13.08 s\n",
      "DEEPMD INFO    batch    2800 training time 14.58 s, testing time 0.04 s, total wall time 14.74 s\n",
      "DEEPMD INFO    batch    3000 training time 13.21 s, testing time 0.04 s, total wall time 13.35 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    3200 training time 14.40 s, testing time 0.07 s, total wall time 15.14 s\n",
      "DEEPMD INFO    batch    3400 training time 13.08 s, testing time 0.04 s, total wall time 13.23 s\n",
      "DEEPMD INFO    batch    3600 training time 12.93 s, testing time 0.06 s, total wall time 13.13 s\n",
      "DEEPMD INFO    batch    3800 training time 15.23 s, testing time 0.05 s, total wall time 15.43 s\n",
      "DEEPMD INFO    batch    4000 training time 13.20 s, testing time 0.04 s, total wall time 13.35 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    4200 training time 14.82 s, testing time 0.05 s, total wall time 16.06 s\n",
      "DEEPMD INFO    batch    4400 training time 14.26 s, testing time 0.05 s, total wall time 14.42 s\n",
      "DEEPMD INFO    batch    4600 training time 15.50 s, testing time 0.05 s, total wall time 15.66 s\n",
      "DEEPMD INFO    batch    4800 training time 14.12 s, testing time 0.05 s, total wall time 14.29 s\n",
      "DEEPMD INFO    batch    5000 training time 15.71 s, testing time 0.05 s, total wall time 15.88 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    5200 training time 14.36 s, testing time 0.07 s, total wall time 15.40 s\n",
      "DEEPMD INFO    batch    5400 training time 15.77 s, testing time 0.05 s, total wall time 15.93 s\n",
      "DEEPMD INFO    batch    5600 training time 14.12 s, testing time 0.05 s, total wall time 14.29 s\n",
      "DEEPMD INFO    batch    5800 training time 15.53 s, testing time 0.04 s, total wall time 15.70 s\n",
      "DEEPMD INFO    batch    6000 training time 15.39 s, testing time 0.09 s, total wall time 15.58 s\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/training/saver.py:1066: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/training/saver.py:1066: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    6200 training time 14.74 s, testing time 0.05 s, total wall time 15.64 s\n",
      "DEEPMD INFO    batch    6400 training time 15.24 s, testing time 0.09 s, total wall time 15.44 s\n",
      "DEEPMD INFO    batch    6600 training time 14.29 s, testing time 0.05 s, total wall time 14.48 s\n",
      "DEEPMD INFO    batch    6800 training time 15.46 s, testing time 0.09 s, total wall time 15.66 s\n",
      "DEEPMD INFO    batch    7000 training time 15.34 s, testing time 0.05 s, total wall time 15.54 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    7200 training time 15.63 s, testing time 0.05 s, total wall time 16.19 s\n",
      "DEEPMD INFO    batch    7400 training time 14.71 s, testing time 0.06 s, total wall time 14.90 s\n",
      "DEEPMD INFO    batch    7600 training time 15.96 s, testing time 0.05 s, total wall time 16.12 s\n",
      "DEEPMD INFO    batch    7800 training time 19.68 s, testing time 0.06 s, total wall time 19.92 s\n",
      "DEEPMD INFO    batch    8000 training time 15.81 s, testing time 0.07 s, total wall time 16.00 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    8200 training time 13.62 s, testing time 0.04 s, total wall time 14.54 s\n",
      "DEEPMD INFO    batch    8400 training time 13.23 s, testing time 0.04 s, total wall time 13.38 s\n",
      "DEEPMD INFO    batch    8600 training time 14.90 s, testing time 0.04 s, total wall time 15.08 s\n",
      "DEEPMD INFO    batch    8800 training time 13.19 s, testing time 0.04 s, total wall time 13.34 s\n",
      "DEEPMD INFO    batch    9000 training time 13.78 s, testing time 0.09 s, total wall time 14.00 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    batch    9200 training time 13.76 s, testing time 0.04 s, total wall time 14.41 s\n",
      "DEEPMD INFO    batch    9400 training time 13.06 s, testing time 0.04 s, total wall time 13.20 s\n",
      "DEEPMD INFO    batch    9600 training time 14.23 s, testing time 0.04 s, total wall time 14.42 s\n",
      "DEEPMD INFO    batch    9800 training time 13.72 s, testing time 0.05 s, total wall time 13.88 s\n",
      "DEEPMD INFO    batch   10000 training time 13.92 s, testing time 0.09 s, total wall time 14.12 s\n",
      "DEEPMD INFO    saved checkpoint model.ckpt\n",
      "DEEPMD INFO    average training time: 0.0737 s/batch (exclude first 200 batches)\n",
      "DEEPMD INFO    finished training\n",
      "DEEPMD INFO    wall time: 756.650 s\n"
     ]
    }
   ],
   "source": [
    "# ########## Time Warning: 120 secs,C32_CPU ; 13 mins ,C2_CPU ##########\n",
    "! cd DeePMD-kit_Tutorial/01.train/ && dp train input.json"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c10e0a81-ef33-49ab-ae2d-83fbd35985ac",
   "metadata": {
    "tags": []
   },
   "source": [
    "On the screen, you will see the information of the data system(s)\n",
    "\n",
    "```\n",
    "DEEPMD INFO    -----------------------------------------------------------------\n",
    "DEEPMD INFO    ---Summary of DataSystem: training     ----------------------------------\n",
    "DEEPMD INFO    found 1 system(s):\n",
    "DEEPMD INFO                                 system  natoms  bch_sz   n_bch   prob  pbc\n",
    "DEEPMD INFO               ../00.data/training_data       5       7      23  1.000    T\n",
    "DEEPMD INFO    -------------------------------------------------------------------------\n",
    "DEEPMD INFO    ---Summary of DataSystem: validation   ----------------------------------\n",
    "DEEPMD INFO    found 1 system(s):\n",
    "DEEPMD INFO                                 system  natoms  bch_sz   n_bch   prob  pbc\n",
    "DEEPMD INFO             ../00.data/validation_data       5       7       5  1.000    T\n",
    "DEEPMD INFO    -------------------------------------------------------------------------\n",
    "```\n",
    "\n",
    "and the starting and final learning rate of this training\n",
    "\n",
    "```\n",
    "DEEPMD INFO    start training at lr 1.00e-03 (== 1.00e-03), decay_step 50, decay_rate 0.950006, final lr will be 3.51e-08\n",
    "```\n",
    "\n",
    "If everything works fine, you will see, on the screen, information printed every 1000 steps, like\n",
    "\n",
    "```\n",
    "DEEPMD INFO    batch     200 training time 6.04 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch     400 training time 4.80 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch     600 training time 4.80 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch     800 training time 4.78 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch    1000 training time 4.77 s, testing time 0.02 s\n",
    "DEEPMD INFO    saved checkpoint model.ckpt\n",
    "DEEPMD INFO    batch    1200 training time 4.47 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch    1400 training time 4.49 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch    1600 training time 4.45 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch    1800 training time 4.44 s, testing time 0.02 s\n",
    "DEEPMD INFO    batch    2000 training time 4.46 s, testing time 0.02 s\n",
    "DEEPMD INFO    saved checkpoint model.ckpt\n",
    "```\n",
    "\n",
    "They present the training and testing time counts. At the end of the 1000th batch, the model is saved in TensorFlow's checkpoint file `model.ckpt`. At the same time, the training and testing errors are presented in file `lcurve.out`. \n",
    "\n",
    "The file contains 8 columns, form left to right, are the training step, the validation loss, training loss, root mean square (RMS) validation error of energy, RMS training error of energy, RMS validation error of force, RMS training error of force and the learning rate. The RMS error (RMSE) of the energy is normalized by number of atoms in the system. \n",
    "```\n",
    "head -n 2 lcurve.out\n",
    "#  step      rmse_val    rmse_trn    rmse_e_val  rmse_e_trn    rmse_f_val  rmse_f_trn         lr\n",
    "      0      2.02e+01    1.51e+01      1.37e-01    1.41e-01      6.40e-01    4.79e-01    1.0e-03\n",
    "```\n",
    "and\n",
    "```\n",
    "$ tail -n 2 lcurve.out\n",
    "   9800      2.45e-02    4.02e-02      3.20e-04    3.88e-04      2.40e-02    3.94e-02    4.3e-08\n",
    "  10000      4.60e-02    3.76e-02      8.65e-04    5.35e-04      4.52e-02    3.69e-02    3.5e-08\n",
    "```\n",
    "Volumes 4, 5 and 6, 7 present energy and force training and testing errors, respectively. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "4aabcec8-9058-4582-863d-00550bb05187",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "#  step      rmse_val    rmse_trn    rmse_e_val  rmse_e_trn    rmse_f_val  rmse_f_trn         lr\n",
      "      0      1.79e+01    2.26e+01      1.35e-01    1.33e-01      5.67e-01    7.15e-01    1.0e-03\n",
      "   9800      3.53e-02    2.64e-02      5.75e-04    3.01e-04      3.46e-02    2.59e-02    4.3e-08\n",
      "  10000      2.76e-02    2.25e-02      4.83e-04    1.62e-04      2.71e-02    2.21e-02    3.5e-08\n"
     ]
    }
   ],
   "source": [
    "! cd DeePMD-kit_Tutorial/01.train.finished/ && head -n 2 lcurve.out && tail -n 2 lcurve.out"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34f3de74-9b9c-4143-94c6-1b91adbfb8d4",
   "metadata": {},
   "source": [
    "The loss function can be visualized to monitor the training process."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "a7444fb4-a869-4b44-a1e3-2d74679189ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAG1CAYAAAAV2Js8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAC1LElEQVR4nOzdeViU5frA8e87M2zDvqMoiOIuoqLimkumaZlLLtlmZXYqq1O2mL86ZZuWZdlx6ZSe1FLL6qRtlrtiLrjvK4qCCgKy77O8vz8GJklRwIEBvT/XNZfMu97vqHDzPPfzPIqqqipCCCGEELcgjb0DEEIIIYSwF0mEhBBCCHHLkkRICCGEELcsSYSEEEIIccuSREgIIYQQtyxJhIQQQghxy5JESAghhBC3LEmEhBBCCHHL0tk7gNrObDZz4cIF3N3dURTF3uEIIYQQogJUVSUnJ4f69euj0ZTf7iOJ0HVcuHCBhg0b2jsMIYQQQlRBYmIiDRo0KHe/JELX4e7uDlg+SA8PDztHI4QQQoiKyM7OpmHDhtaf4+WRROg6SrvDPDw8JBESQggh6pjrlbVIsbQQQgghblmSCAkhhBDiliVdY0IIIW4KJpMJg8Fg7zBEDXFwcECr1d7wdSQREkIIUaepqkpycjKZmZn2DkXUMC8vL4KCgm5oehtJhIQQQtRppUlQQEAAer1e5ny7BaiqSn5+PikpKQDUq1evyteSREgIIUSdZTKZrEmQr6+vvcMRNcjFxQWAlJQUAgICqtxNJsXSQggh6qzSmiC9Xm/nSIQ9lP6930htmCRC5ZgzZw6tWrWiU6dO9g5FCCHEdUh32K3JFn/vkgiVY8KECRw5coSdO3faOxQhhBBCVBNJhIQQQghxy5JESAghhBC1Uu/evXn++eer9R6SCAkhhBDiliXD5yvo0Mf34OZckY9LrfA1DQ7ueA+YTOM20VUPTAghxE2huLgYR0dHe4dxy5EWoQpqU7SHtoU7K/DaVeFXVM4GGnw/kG2L/g+jodjejyiEEDcFVVXJLzbW+EtVK/6LMFi6fZ555hkmTpyIn58fd9xxB4qisGrVKtq3b4+Liwt9+/YlJSWF33//nZYtW+Lh4cGYMWPIz8+3XueHH34gIiICFxcXfH196devH3l5edb9CxYsoGXLljg7O9OiRQvmzp1b4RjPnz/P6NGj8fb2xtfXlyFDhnDmzJnrnrdq1SqcnZ2vmO37ueeeo1evXgBcunSJMWPG0KBBA/R6PREREXzzzTcVjs1WpEWognZHvIGb3qViB1dwOJ/u+C+0z99K1/g5HP9gHfrRX9CwaeQNRCmEEKLAYKLVG6tq/L5H3h6A3rFyP1YXLVrEU089xZYtW9iwYQMxMTFMmTKF2bNno9frGTVqFKNGjcLJyYmlS5eSm5vLsGHDmDVrFpMmTSIpKYkxY8Ywffp0hg0bRk5ODps3b7YmZfPmzePNN99k9uzZtG/fnr179zJ+/HhcXV0ZO3bsNWPLz8+nT58+9OzZk5iYGHQ6He+++y533nknBw4cuGbrVb9+/fDy8uJ///sf48aNAyyTX3733Xe8/fbbABQWFhIVFcWkSZPw8PDgt99+46GHHqJx48ZER9dcT4kkQhUUdfcTeHh42PSaqvlJdv48lxZ736W58RgFi/uxvcULdB41CY0NFpITQghRu4WHhzN9+nQAkpKSAHj33Xfp3r07AOPGjWPy5MmcOnWKxo0bAzBixAg2bNhgTYSMRiPDhw8nNDQUgIiICOv133nnHWbMmMHw4cMBCAsL48iRI3z++efXTYS+/fZbNBoN8+fPt87Xs2DBAry8vNi4cSP9+/cv91ytVsvo0aNZunSpNRFat24dGRkZjBw5EoDg4GBeeukl6znPPvssf/zxB99//70kQrcKRaOh09BnSO4wgLNLHqdN0T66HP+AQ9NX4ffAfIJCmto7RCGEqHNcHLQceXuAXe5bWR07drxiW9u2ba1fBwYGotfrrUlQ6bYdO3YAEBkZye23305ERAQDBgygf//+jBgxAm9vb1JTU0lMTGTcuHGMHz/eer7RaMTT0/O6se3evZu4uDjc3d3LbC8sLOTUqVPXPf+BBx6ga9euXLhwgfr167NkyRIGDRqEt7c3YGkhev/991m2bBnnz5+nqKiIoqIiXF1dr3ttW5JEqBYICmlKwCvrif1+Om2Pfkybon3k/LcnO9q9RqchE1A0UsolhBAVpShKpbuo7OVqP/QdHBysXyuKUuZ96Taz2QxYWl7WrFnD1q1bWb16NbNmzeK1114jNjbWuvzEvHnzrmhhqci6XGazmaioKJYsWXLFPn9//+ue37lzZ5o0acK3337LU089xfLly1mwYIF1/4wZM/jkk0+YOXMmERERuLq68vzzz1NcXLM1s3XjX8otQKPVEn3fZBJPDiJ/2RM0Nx6j8/7X2XtyJQ0f/gK/oIb2DlEIIUQtpCgK3bt3p3v37rzxxhuEhoayfPlyJk6cSHBwMKdPn+aBBx6o9HU7dOjAsmXLCAgIqHJpyP3338+SJUto0KABGo2Gu+66y7pv8+bNDBkyhAcffBCwJF4nT56kZcuWVbpXVUlTQy3TsGkk4a9uYVvYMxSrWtrnb0X7n27s+WOhvUMTQghRy8TGxjJ16lR27dpFQkICP/74I6mpqdZkYsqUKUybNo1PP/2UEydOcPDgQRYsWMDHH3983Ws/8MAD+Pn5MWTIEDZv3kx8fDybNm3in//8J+fOnatQfA888AB79uzhvffeY8SIETg7O1v3hYeHW1uzjh49yj/+8Q+Sk5Or9kHcAEmEaiGtTkfXse9xbuTvnNKG4U02Hbb/k10f30tWeqq9wxNCCFFLeHh4EBMTw6BBg2jWrBmvv/46M2bMYODAgQA8/vjjzJ8/n4ULFxIREUGvXr1YuHAhYWFh1722Xq8nJiaGkJAQhg8fTsuWLXnssccoKCiocAtR06ZN6dSpEwcOHLiiVepf//oXHTp0YMCAAfTu3ZugoCCGDh1a6c/gRilqZSc+uMVkZ2fj6elJVlaWzUeNVURxUSG7v3qVzucWolVUUvAhudeHtO0zosZjEUKI2qawsJD4+HjCwsLKtDaIW8O1/v4r+vNbWoRqOUcnZ7qOn0nc4B9JVOoTQDptN40jdtbD5OVk2js8IYQQok6TRKiOaN6xL34v7WC7v2X+hehLP5H1cWeObP/DzpEJIYSoi6ZOnYqbm9tVX6Vda9dS3rlubm5s3ry5Bp7ANqRr7Drs3TV2NYe2/ILfmhcIIhWzqrAj6D7aPTIDZ5eanXtBCCHsTbrGqi49PZ309PSr7nNxcSE4OPia58fFxZW7Lzg4GBeXCq7GcANs0TUmw+froDbdB5PTpjs7Fkygc+ZKulz8hrMf/knx4Lk0bX+bvcMTQghRB/j4+ODj41Pl88PDw20Yjf3cEl1jv/76K82bN6dp06bMnz/f3uHYhLunD52f/4Z9Pf5DGl6EmhMJWzGEbf99CUNxkb3DE0IIIeqEmz4RMhqNTJw4kfXr17Nnzx4++OCDcpsC66J2/cageyaW3W690SlmuibO48wH3Th7dLe9QxNCCCFqvZs+EdqxYwetW7cmODgYd3d3Bg0axKpVNb8qcXXy8gsi6qWf2NXpI7JwpakpjqBvB7B98ZuYjEZ7hyeEEELUWrU+EYqJiWHw4MHUr18fRVFYsWLFFcfMnTvXWigVFRVVplr9woULZQq+GjRowPnz52si9BrX8a7xFD+xlf3OnXBSDHSJm8nxD3px/vRRe4cmhBBC1Eq1PhHKy8sjMjKS2bNnX3X/smXLeP7553nttdfYu3cvPXv2ZODAgSQkJABwtUFxiqKUe7+ioiKys7PLvOoS//qNaPvKanZETCFPdaaV4RDei3oR+/1HqCWL9AkhhBDCotYnQgMHDuTdd99l+PDhV93/8ccfM27cOB5//HFatmzJzJkzadiwIZ999hlgGcJ3eQvQuXPnqFevXrn3mzZtGp6entZXw4Z1b7FTRaOh870vkPXIJg47RqBXiog+/A4Hp99Byvl4e4cnhBBC1Bq1PhG6luLiYnbv3k3//v3LbO/fvz9bt24FoHPnzhw6dIjz58+Tk5PDypUrGTBgQLnXnDx5MllZWdZXYmJitT5Ddaof1oKWkzaxvemLFKkOtC3chfO87uz6+T/SOiSEEKJaPfLII3ZZO6yy6nQilJaWhslkIjAwsMz2wMBA6wq2Op2OGTNm0KdPH9q3b8/LL7+Mr69vudd0cnLCw8OjzKsu02i1dHngDZLHrOaErhke5NFxzyT2zhhCesrNWSslhBB1UXFxsb1DsAuDwWDX+9fpRKjU32t+VFUts+2ee+7hxIkTxMXF8cQTT9R0eLVCaIsONJ60hW2hT2JQtXTIi0Gd25W9qxfbOzQhhLAtVYXivJp/VXKhht69e/PMM88wceJE/Pz8uOOOO1AUhVWrVtG+fXtcXFzo27cvKSkp/P7777Rs2RIPDw/GjBlDfn6+9To//PADERERuLi44OvrS79+/cjLy7PuX7BgAS1btsTZ2ZkWLVowd+7cCsd4/vx5Ro8ejbe3N76+vgwZMoQzZ85c97wpU6awaNEifvrpJxRFQVEUNm7cyJkzZ1AUhe+++47evXvj7OzM4sWLra1HH330EfXq1cPX15cJEybUSJJUp2eW9vPzQ6vVWlt/SqWkpFzRSlRZc+bMYc6cOZhMphu6Tm2ic3Ck66MfELd/MLqfnqKROQHfrRPYefgXmj86Fw+v8lvKhBCizjDkw9T6NX/f/7sAjpVb6mjRokU89dRTbNmyhQ0bNhATE8OUKVOYPXs2er2eUaNGMWrUKJycnFi6dCm5ubkMGzaMWbNmMWnSJJKSkhgzZgzTp09n2LBh5OTksHnzZutAoXnz5vHmm28ye/Zs2rdvz969exk/fjyurq6MHTv2mrHl5+fTp08fevbsSUxMDDqdjnfffZc777yTAwcO4OjoWO65L730EkePHiU7O5sFCxYAlpmsL1y4AMCkSZOYMWMGCxYswMnJiU2bNrFhwwbq1avHhg0biIuLY/To0bRr147x48dX6jOtrDqdCDk6OhIVFcWaNWsYNmyYdfuaNWsYMmTIDV17woQJTJgwwbpWyc0kPLIHRc1j2bboZaIvLKFT1h8kz+xMwu0f06bnjX1uQgghKi48PJzp06cDkJSUBMC7775L9+7dARg3bhyTJ0/m1KlTNG7cGIARI0awYcMGayJkNBoZPnw4oaGhAERERFiv/8477zBjxgzrgKOwsDCOHDnC559/ft1E6Ntvv0Wj0TB//nxrL8uCBQvw8vJi48aNV9TnXs7NzQ0XFxeKiooICgq6Yv/zzz9/xSAob29vZs+ejVarpUWLFtx1112sW7dOEqHc3NwyC7vFx8ezb98+fHx8CAkJYeLEiTz00EN07NiRrl278sUXX5CQkMCTTz5px6hrPydnPV3/MYdjsUNw++NZGqjJBK17mNj9w4l4ZCZ6t5sr+RNC3EIc9JbWGXvct5I6dux4xba2bdtavw4MDESv11uToNJtO3bsACAyMpLbb7+diIgIBgwYQP/+/RkxYgTe3t6kpqaSmJjIuHHjyiQTRqOxQr/g7969m7i4ONzd3ctsLyws5NSpU5V+1std7blbt26NVqu1vq9Xrx4HDx68oftURK1PhHbt2kWfPn2s7ydOnAjA2LFjWbhwIaNHj+bSpUu8/fbbJCUl0aZNG1auXGnNjMW1tYjuT16rWGIXvUB02o9Ep/3IuRnbSBg0mxad+tk7PCGEqDxFqXQXlb24ul4Zp4ODg/VrRVHKvC/dZi4Z+avValmzZg1bt25l9erVzJo1i9dee43Y2Fj0ektiNm/ePKKjo8tc4/KEozxms5moqCiWLFlyxT5/f//rP9w1XO+5oexzVqdanwj17t37qpMiXu7pp5/m6aeftul9b8YaofK4unsR/cwCDm4aTOCGF2mgJmH6dQTb9j5Eh4c/wMm58r/lCCGEqBmKotC9e3e6d+/OG2+8QWhoKMuXL2fixIkEBwdz+vRpHnjggUpft0OHDixbtoyAgIAqjaB2dHSsEz9Db4pRY9VhwoQJHDlyhJ07d9o7lBoT0Ws4Tv/cyU7P/mgVla4XvuLC9K6cOrDV3qEJIYS4itjYWKZOncquXbtISEjgxx9/JDU1lZYtWwKW0VvTpk3j008/5cSJExw8eJAFCxbw8ccfX/faDzzwAH5+fgwZMoTNmzcTHx/Ppk2b+Oc//8m5c+eue36jRo04cOAAx48fJy0tze7D5MsjiZAow9Pbj04vfM+errNJx4Mw8xka/u9uti18FaPh1pzjQgghaisPDw9iYmIYNGgQzZo14/XXX2fGjBkMHDgQgMcff5z58+ezcOFCIiIi6NWrFwsXLiQsLOy619br9cTExBASEsLw4cNp2bIljz32GAUFBRVqIRo/fjzNmzenY8eO+Pv7s2XLlht+3uqgqNfrd7rFlY4ay8rKqvOTK1bWpYvnSPjqH7TP+xOAE7pmOI+aR0izdvYNTAghShQWFhIfH29deFvcWq7191/Rn9/SIiTK5RvYgHYv/sLO9tPIRk8z4wkClvRj+9J3MdeBfl8hhBDieiQRKsecOXNo1aoVnTp1sncodqVoNHQa8jT54zZz0KkDzoqBLic+5OgHfUg6e9ze4QkhhKiiqVOn4ubmdtVXadfatZR3rpubG5s3b66BJ7AN6Rq7jlu5a+zvVLOZHd9/SMSRGeiVInJVF460fZVOw55D0UhOLYSoedI1VnXp6emkp6dfdZ+LiwvBwcHXPP/yOf7+Ljg4GBcXlxuKryJs0TVW64fPi9pD0WiIHj2Jc3F3kbBsPC0MR+h88E32xf1Og4e+wK++zN0khBB1hY+PDz4+PlU+Pzw83IbR2I/8Gi8qrUF4G5pO2sz2xs9RrOpoV7Ad3Rfd2L3yv/YOTQghhKgUSYRElWh1Oro8/A7nR63klLYxXuQStWMiu2cMIzMt+foXEEIIIWoBSYTKIcXSFRPWOpqGr2xje4NxGFUNUTnrMc6OZv/67+wdmhBCCHFdUix9HVIsXXEn9mzE6dcJhJotM47u8L6bVo/Oxs3D286RCSFuVlIsfWuTeYRErdKsQ28CX4ple8BoADpn/Er2J505vHWlnSMTQgghrk4SIWFTzno3ujz9BYfvWMoFJYD6agotV93P9s/+QWF+rr3DE0IIUQnHjh2jS5cuODs7065du2q/38aNG1EUhczMzGq/VylJhES1aN39Ljxe2MEO77vRKCpdLn7LxY+iObFnk71DE0IIUUFvvvkmrq6uHD9+nHXr1tk7nGohiZCoNm4e3nT+5xL23/Y5aXgRaj5H45+Gsn3+RIqLCu0dnhBC1CrFxbVvYetTp07Ro0cPQkND8fX1tXc41UISIVHtIvveh+6ZWHa790WnmOly7r8kTO9G/JGd9g5NCHETUlWVfEN+jb8qO/aod+/ePPPMM0ycOBE/Pz/uuOMOFEVh1apVtG/fHhcXF/r27UtKSgq///47LVu2xMPDgzFjxpCfn2+9zg8//EBERAQuLi74+vrSr18/8vLyrPsXLFhAy5YtcXZ2pkWLFsydO7dC8SmKwu7du3n77bdRFIUpU6Zc8/iuXbvy6quvltmWmpqKg4MDGzZsAGDx4sV07NgRd3d3goKCuP/++0lJSangJ1Y9ZGbpcsyZM4c5c+ZgksVFbcLLL4ioF5eze+V/abLjDcJNpyhedifbmzxNp/vfRKuTf4pCCNsoMBYQvTS6xu8be38segd9pc5ZtGgRTz31FFu2bGHDhg3ExMQwZcoUZs+ejV6vZ9SoUYwaNQonJyeWLl1Kbm4uw4YNY9asWUyaNImkpCTGjBnD9OnTGTZsGDk5OWzevNmalM2bN48333yT2bNn0759e/bu3cv48eNxdXVl7Nix14wtKSmJfv36ceedd/LSSy/h5uZ2zeMfeOABPvzwQ6ZNm4aiKAAsW7aMwMBAevXqBVhavd555x2aN29OSkoKL7zwAo888ggrV9pvUI0Mn78OGT5ve2kXznL+6/FEFsQCcNShFe6j59EgvI2dIxNC1DVXGz6db8ivE4lQ7969ycrKYu/evYClULhPnz6sXbuW22+/HYD333+fyZMnc+rUKRo3bgzAk08+yZkzZ/jjjz/Ys2cPUVFRnDlzhtDQK5c5CgkJ4YMPPmDMmDHWbe+++y4rV65k69at142xXbt2DB069LqtQWBp/alfvz7r16+nZ8+eAHTr1o0ePXowffr0q56zc+dOOnfuTE5ODm5ubtbPICMjAy8vr+veU9YaE3WSX/1QfF/+g50rZtFy/zRaGo6Q/3VfYlu/ROcRL8kCrkKIG+KicyH2/li73LeyOnbseMW2tm3bWr8ODAxEr9dbk6DSbTt27AAgMjKS22+/nYiICAYMGED//v0ZMWIE3t7epKamkpiYyLhx4xg/frz1fKPRiKenZ6VjvR5/f3/uuOMOlixZQs+ePYmPj2fbtm189tln1mP27t3LlClT2LdvH+np6ZjNZgASEhJo1aqVzWOqCPmJI+xC0WjoNPyfZD+6icOObdErRUQfeY9DH9zOxXOn7B2eEKIOUxQFvYO+xl+l3UGV4erqesU2BweHMs9y+fvSbaUJhFarZc2aNfz++++0atWKWbNm0bx5c+Lj463HzJs3j3379llfhw4dYvv27ZWOtSIeeOABfvjhBwwGA0uXLqV169ZERkYCkJeXR//+/XFzc2Px4sXs3LmT5cuXA/YtFJdESNhV/UbNaTlpI9ubv0Kh6kBE0R5c5vdg509zUUv+EwshhCifoih0796dt956i7179+Lo6Mjy5csJDAwkODiY06dPEx4eXuYVFhZWLbEMHTqUwsJC/vjjD5YuXcqDDz5o3Xfs2DHS0tJ4//336dmzJy1atLB7oTRI15ioBTRaLV3GvEbCibso/G48zYwn6LR3MntP/EbIw5/jG9jA3iEKIUStFBsby7p16+jfvz8BAQHExsaSmppKy5YtAZgyZQrPPfccHh4eDBw4kKKiInbt2kVGRgYTJ060eTyurq4MGTKEf/3rXxw9epT777/fui8kJARHR0dmzZrFk08+yaFDh3jnnXdsHkNlSYuQqDVCmrWj8aQtbGv0FMWqlvZ5f6J81pU9q762d2hCCFEreXh4EBMTw6BBg2jWrBmvv/46M2bMYODAgQA8/vjjzJ8/n4ULFxIREUGvXr1YuHBhtbUIgaV7bP/+/fTs2ZOQkBDrdn9/fxYuXMj3339Pq1ateP/99/noo4+qLY6KklFj1yGjxuzj1IGtaFY8RZj5DAA7PfvT7JHP8PT2s29gQohaRRZdvbXJoqvVaM6cObRq1YpOnTrZO5RbUpO23aj/yja21X8Yk6rQKWs1hZ925mDMcnuHJoQQ4iYiiVA5JkyYwJEjR9i5U2Y/thcnZz1dn5jFybu+55xSj0AuEbH+EWJnjSU/N8ve4QkhRJ02depU3Nzcrvoq7Vq7kePrCukauw7pGqsd8nOzOLjwBaLT/gfAOSWI3Dtn0SK6v50jE0LYk3SNVV16ejrp6elX3efi4kJwcPANHV8TZEJFccvQu3kS/cyXHIwZgv/6iTRQkzGtHMX2Uy8Rfd//ySSMQghRST4+Pvj4+FTb8XWF/PQQdUrEbUPQP7+DXR53oFVUupz4kB1zHsVoqH2rNgshhKj9JBESdY6Hly9Rz3/H9vDnMasK0ZdWcGTGnWRlpNk7NCGEEHWMJEKiTlI0Gro8+Bb7u88mX3WibeFuMmf15vzpo/YOTQghRB0iiZCo09r3f5ALw5eTgg+h5kT0X/XnWOxqe4clhBCijpBESNR54ZHdYfx64rRN8CabxivHsOvn/9g7LCGEEHWAJELiphAQHEb9Fzaw17UHjoqRjnsmsX3+RMwmk71DE0KIOuvYsWN06dIFZ2dn2rVrZ+9wqoUkQuWQmaXrHr2bJ5ETf2ZbvYcB6HLuv+z9ZDiF+bl2jkwIIeqmN998E1dXV44fP866deuueeyZM2dQFIV9+/bVTHA2IolQOWRm6bpJo9XS9R+z2BH5DgZVS1TuRs5+3Je05AR7hyaEENdUXFz7pgE5deoUPXr0IDQ0FF9fX5tcs7Y9pyRC4qbUedhznOj/NZm40dx4HON/+hJ/ONbeYQkhaoCqqpjz82v8VdmFGnr37s0zzzzDxIkT8fPz44477kBRFFatWkX79u1xcXGhb9++pKSk8Pvvv9OyZUs8PDwYM2YM+fn51uv88MMPRERE4OLigq+vL/369SMvL8+6f8GCBbRs2RJnZ2datGjB3LlzKxSfoijs3r2bt99+G0VRmDJlyjWPL13Rvn379iiKQu/evQF45JFHGDp0KNOmTaN+/fo0a9bM2nr0448/0qdPH/R6PZGRkWzbtq1Sn6EtyMzS4qbVuvtdJAb+Qc6SUTRUL5D33T3s7zWLyL6j7B2aEKIaqQUFHO8QVeP3bb5nN4peX6lzFi1axFNPPcWWLVvYsGEDMTExTJkyhdmzZ6PX6xk1ahSjRo3CycmJpUuXkpuby7Bhw5g1axaTJk0iKSmJMWPGMH36dIYNG0ZOTg6bN2+2JmXz5s3jzTffZPbs2bRv3569e/cyfvx4XF1dGTt27DVjS0pKol+/ftx555289NJLuLm5XfP4HTt20LlzZ9auXUvr1q1xdHS07lu3bh0eHh6sWbOmTML42muv8dFHH9G0aVNee+01xowZQ1xcHDpdzaUnkgiJm1rD8AiyntnI4c9H0rp4P202PcH2iyeJHj1ZluUQQthdeHg406dPByyJB8C7775L9+7dARg3bhyTJ0/m1KlTNG7cGIARI0awYcMGayJkNBoZPnw4oaGhAERERFiv/8477zBjxgyGDx8OWFptjhw5wueff37dRCgoKAidToebmxtBQUHXfRZ/f38AfH19rzje1dWV+fPnW5OjM2fOAPDSSy9x1113AfDWW2/RunVr4uLiaNGixXXvZyuSCImbnqdvIC4vrmbHfx6jc8ZvdDk+ndi5cUT943N0Do7Xv4AQok5RXFxovme3Xe5bWR07drxiW9u2ba1fBwYGotfrrUlQ6bYdO3YAEBkZye23305ERAQDBgygf//+jBgxAm9vb1JTU0lMTGTcuHGMHz/eer7RaMTT07PSsd6IiIiIMi1EpS5/1nr16gGQkpIiiZAQtubo5EynZxezfelbdD75KdFpP3JgxlkaPfk9Hl62KQAUQtQOiqJUuovKXlxdXa/Y5uDgYP1aUZQy70u3mc1mALRaLWvWrGHr1q2sXr2aWbNm8dprrxEbG4u+5DOYN28e0dHRZa6h1Wpt/SjXdLXnhCufFbA+W02RvgFxy7jashzp/+4ly3IIIeo0RVHo3r07b731Fnv37sXR0ZHly5cTGBhIcHAwp0+fJjw8vMyrtLDZlkpbfEx1bP42aRESt5z2/R8kLrARHssfopE5kYyv+nNs4H9pEd3f3qEJIUSlxMbGsm7dOvr3709AQACxsbGkpqbSsmVLAKZMmcJzzz2Hh4cHAwcOpKioiF27dpGRkcHEiRNtGktAQAAuLi788ccfNGjQAGdn5xrvgqsKSYSEzaiqimowoBYXl339bZu5zDbDlccYyp5ntp5rKHOcxs0Nr2FDce3Zs9KFz+GRPUjxW0/cl/cSbjqF68ox7Lr4Hh3vebKaPh0hhLA9Dw8PYmJimDlzJtnZ2YSGhjJjxgwGDhwIwOOPP45er+fDDz/klVdewdXVlYiICJ5//nmbx6LT6fj3v//N22+/zRtvvEHPnj3ZuHGjze9ja4pa2YkPbjHZ2dl4enqSlZWFh4eHvcMBLAkHRuPfkgrDVZOIvyckZZKKqx1nKE04yk9ArpbgmA0GMBjs8nk4hobi/eCDeA4bhtbt6v3Q5cnPzeL4Z/fTPu9PALY3GEf0Yx/JiDIh6ojCwkLi4+MJCwvD2dnZ3uGIGnatv/+K/vyWROg6Sj/IYxNfxN3JybYXV9Vykoq/khFrwvK346gLf20ODmgcHFAcHFAcHcHRAdVBh+qgw6zTYNZpMekUTDoNRp2CUQMGLRh0KsUalSKtmSKNmWLFRIHGRKHGSIFiJF8xUKAYaHRRpce+YhzyLbOUalxd8bx3OD4PPohjSEiFwzSbTMTOf56uSV8BsNu9D62fWoyz/tpzZggh7E8SoVubJEI1oPSD3BHeFLcarrKvMI0GxdHRmnBYXg5oHB1LkhHHy7Y7/u1Yy5/WYx0dMeu0GLRg1EGxRqVYY0lICrVmChUjRRqTNSGxvIrJo5g8ishVishVi8hVC8gzFVBgLCDfmE++IR8V2/9TcypW6X1Q5Z49OvzTSqZtVxTcevfG56EH0Xftah2JcD07f/yUdvvfwkExcVzXHN/H/4dfUEObxyyEsB1JhKpu6tSpTJ069ar7evbsye+//35Dx9cESYRqQOkHeXrmp7hXYY6I6ylNRJSSJKRsslKSqDhcJbkpSVgKNSYKMViTjcv/LDAWlNlWYCwou62cY41mo82f83IuOhf0Or3lTwc9ep3e+ufl21wcyj9Or9NzLvccv57+lQ0JGzCYimh7WmXQLpX2p//6J+0Y3gSfBx/Cc8g9aCrw93d4y28Er3kCL3JJxp+CkUsIax193fOEEPYhiVDVpaenk56eftV9Li4uBAcH39DxNUESoWo0Z84c5syZg8lk4sSJE6w9vhZX98rVn1yP2Wy2tphcLWkpk9xcJZkpNBXaNJ6/c9Q4onfQWxOXyxOUv2+7WiJztW3OOmc0im3rb7KLs1lzZg2/nP6F3Rd3U++Syp27zfQ5oOJcUrak8fDAe9RIvMeMweE6/1kT4w5C6bIcqjNxsiyHELWWJEK3NkmEakDpB9nys5ZoXWpn15hG0eCqc7UmHGVaVa7WmvK35KbMeZdtc9A4XP/mtcz53PP8eupXfj39KxdT4ul7wJIUBWaWHKDR4N6vHz4PPYhLx47ldptlXbrIuZJlOUyqws4WL8uyHELUQqU/CBs1aoRLNbTai9qtoKCAM2fOSCJUnUo/yLu/uRsHvW0TAwXlqonJ9bqF/r7NUeNY4TqYW4WqqhxKO8TPp35m1enfaXwkg4G7VNqe+eufu7Z5OAFjH8PjrkForlIIX1xUyL6SZTkAYv2Gy7IcQtQypa32AQEB+PrKLPG3mkuXLpGSkkKzZs2umC1bEiEbqY3D50XlGEwG/jz/J7+c/oW43eu5Y2cxtx1ScSwphTJ6uuI7+j78H3gYh8CAMueqZjOxJctyaBSVA85RsiyHELVMUlISmZmZBAQEoNfr5RfDW4CqquTn55OSkoKXl5d1nbLLSSJkI5II3VyyirJYfXY1aw8sx3/tfgbsMeOXbdln1ioYe3WmyfjncGvfocx5e1cvpvmWieiVIs5oGuL40A/UD6u5RQGFEOVTVZXk5GQyMzPtHYqoYV5eXgQFBV01+ZVEyEYkEbp5JeYk8tvJnzn7y3d0/DOFVol/7cts4o/3Qw/SfPgjljmQgLj9f+Kx/CECSCcdD1IGfUmLznfYKXohxN+ZTCYMdprYVdQ8BweHay4eK4mQjUgidPNTVZUDaQfYvG4RLsvX0+lQEQ4lawZmu+vIGtSFtuNfIqhBc1LOx5NdsixHsarjQJQsyyGEELWRJEI2IonQrcVgMvDnod9IXPxfwtfH4Z1Xsl0LJ6MCcX9gNFHRw0iYN866LMe2ho/T5dEPZUSZEELUIpII2YgkQreuzNw0YpfORPvDHwQn5Fm3H2+oJfmuDji4GHkk6Te0yLIcQghR20giZCOSCAmAM1tXc2b+HPy2n0BrtmxL84BNUU64NcpkkDEXVW2C7+M/yLIcQghRC0giZCOSCInLFV+8yPH/fopx+Uqcc4oAKNLB5jYKx9qaaOms0K3vv+nQrr+dIxVCiFubJEI2IomQuBpzURHpv/zMhQVf4HDqnHX7wVCFPzoqFLUJ5/7oJ+gb0hcXncx2K4QQNU0SIRuRREhci6qqFOzezcWFX1KwbiNKyX+nZC9YFaVhewdXuje/g8FNBtMpsBNaTe1cpkUIIW42kgjZiCRCoqIM58+T9vViLn3zFdoiSyFRoQNsjFD4vaMGU8NA7m58N4MbDybcO9zO0QohxM1NEiEbkURIVJYpN5f9//oHnltiKc7+a326vY0VVnZUONBYoalPc/qF9qNfSD/CvcJlSQAhhLAxSYRsRBIhUVV7V31NyI+vkn/SkdwLf62KfMFXYV1bhQNhCgkB0NAjlNtDb6dfSD/a+LVBo8h8REIIcaMkEbIRSYTEjShdlsMrJ4ukk97kJ7hDYZF1f7YeDoUqHAxVONRIQa0fwO2h/bg95HaiAqPQaXR2jF4IIeouSYRsRBIhcaMuX5ajoNiR4+pIfNJN5O/chZqfX/ZYz5LEqJFCQjMvolr2pV9IP7rU74KT1slOTyCEEHWPJEI2IomQsIX83CyOzx1D+/wtAGxr9BRd7n+bgoMHydu2nbzt2yjYtx+MxjLnJfhbhuSfbOKMT9ee9Go+kJ4NeuLq4GqPxxBCiDpDEqHLDBs2jI0bN3L77bfzww8/VOpcSYSErZhNJmLnP0fXpMUAxA39lfB2Pf/an5dH/u7dlsRo2zaKjh0rc75Jgbj6cLSRDrVjW1r1Gkqvxv3wdvau0ecQQoi6QBKhy2zYsIHc3FwWLVokiZCwu10f30vH7LUccO5E21fXlnucMSOD/NhYcrduJXNLDMr5i2X2F+ngWEOFzIgQAm+7gy633Uc9j+DqDl8IIeoESYT+ZuPGjcyePVsSIWF3504dJvCrnjgoJo4NXEaL6DsrdJ7h/Hlyt23j4qY1FO3YhWNW2fqiXGdIbOaFY+eOtBowmrA23WVYvhDillXRn992H6cbExPD4MGDqV+/PoqisGLFiiuOmTt3LmFhYTg7OxMVFcXmzZtrPlAhbKRBk9bs8b0LAHXdO6hmc4XOcwgOxnvECFrM+py223cR9vNPOE18ioyO4RQ5aXArhJYHMmkyfy1FI8ezvUtb1v1jGEeX/gfDxZTqfCQhhKiz7D42Ny8vj8jISB599FHuvffeK/YvW7aM559/nrlz59K9e3c+//xzBg4cyJEjRwgJCQEgKiqKoqKiK85dvXo19evXr/ZnEKKyQodNoWj+77QsPsTBzcuJ6HXlv/1rURQF52bNaNysGY2feA7VaCR5158cW/M9hh27CTqdhVeWEa9Nx2DTMeLe/pSc+l64dOlMSN/BuHXujFZaOIUQonZ1jSmKwvLlyxk6dKh1W3R0NB06dOCzzz6zbmvZsiVDhw5l2rRpFb52RbvGioqKyiRV2dnZNGzYULrGhM1tm/sEXVOWEacLp8n/7UTR2K6BNiPzIrvXLCZ181o8DyYQmmQu0/yrKgrmts0IfeZF3Hr0kC40IcRNp850jV1LcXExu3fvpn///mW29+/fn61bt1bLPadNm4anp6f11bBhw2q5jxBN732TPNWZcGMc+9cstum1vb0C6TfyRcb8+3d6r95J8vfvs/HJTmzo6MQFH1BUFe3+45wb/wQH7r2bnK1bqUW/EwkhRI2p1YlQWloaJpOJwMDAMtsDAwNJTk6u8HUGDBjAyJEjWblyJQ0aNGDnzp3lHjt58mSysrKsr8TExCrHL8S1+AUGs7/BGAC8Y6dj/tscQraid9Bze8QQnnr+K8Yv2onz9/P5Zfrd/BHtQLEOHI+c5txj49g3cjA5sdurJQYhhKitanUiVOrvzfaqqlaqKX/VqlWkpqaSn5/PuXPn6NSpU7nHOjk54eHhUeYlRHVpfe/rZOFKqDmRvSvnVfv9HLQOdA/uziv3fMjD/9nAtk8fYk1nRwxacD50inNjH2X3qLvJ3hlb7bEIIURtUKsTIT8/P7Ra7RWtPykpKVe0EtnanDlzaNWq1TWTJiFulKePH4cbPQpA0N5PMBQX1ti9fV18efL2/2PsvBh2zXqU9R2dMGpAf+AU5x96hB333U32nl01Fo8QQthDrU6EHB0diYqKYs2aNWW2r1mzhm7dulXrvSdMmMCRI0eu2Y0mhC1E3vsKaXgRrF5k30+za/z+nk6ePNb3FR5ZsIX9c54gJsoZowbc953i/P0Psf3+u8ncKwmREOLmZPdEKDc3l3379rFv3z4A4uPj2bdvHwkJCQBMnDiR+fPn8+WXX3L06FFeeOEFEhISePLJJ+0YtRC24+ruyYlmTwDQ6PAcigpy7ROHgysP9nmBsYu2cWzuBLZ10GNSwHPPKZLGPMSWB+4iff9uu8QmhBDVxe7D5zdu3EifPn2u2D527FgWLlwIWCZUnD59OklJSbRp04ZPPvmE2267rUbik5mlRU0oLMgn44MI6pHGjqYT6fzAm/YOiWJTMX9sXkDm5/OI2peHpuQ7RUqnxrR+5S38IjraN0AhhLgGWWLDRiQREjVl2w8z6XroTTJxx/HFA+jdfewdEgBGs5G1mxdx6bPPabcvx9qMnBQdRquX3yKojdTRCSFqn5tiHiF7kmJpUdM6DnmaBKU+XuRw6H/v2zscK51Gx529xnHf0m1c/HwyByMt31DqxcZzacTDrHlkIOcP7bBzlEIIUTXSInQd0iIkalLsL/OI3v0SObigPrcfD5/qHR1ZFaqqsmXzN6TMnkXLA5kAmBVI6BJKq5emENq6i30DFEIIpEVIiDqp46DHOKUJw50Cjv/wjr3DuSpFUehx2/0MW7aVnC+mcDLCG40KjbadJWfEo/zy2ABOHd5i7zCFEKJCJBESohbRarVkdHkFgDbnl5GenGDniMqnKAqdbxvNPd9vpfCLd4lv7YNWhfCtCeSPfJzl4/pz9HCMvcMUQohrkkSoHFIjJOwlqt99HNM1x0Up5tSPb9k7nAppf9u9DPrfFsxfTCOhlS86M7TYkohx5D9Y8o/b+f3IcgqNNTdZpBBCVJTUCF2H1AgJe9gb8zPt1z9Esaol6/Ht+DdsZu+QKuX4pp9InPkRwUfTAEj2gq/ucSOsz2CGhA+hrV9bWfFeCFGtZPi8jUgiJOxBVVUOTutN2+J97PYZRNRz39g7pCo5s3o5GW9NxfmSZZLIVR0UFvfRUN+/MUOaDGFwk8EE6APsHKUQ4mYkiZCNSCIk7OVQ7Dra/D4ck6qQ8tAm6oVH2jukKjHl5nLxww/JWvYdAKmeCnMHKRxupEGjaOhWvxtDw4fSu2FvnLROdo5WCHGzkETIRiQREva0+/07iSrcxj6PPrSbuMLe4dyQvK1bSXr9XxguXABgT/cAZkZfotDJ0kXm4ejBwLCBDAsfRivfVtJ1JoS4IZII2YgkQsKeju/fRtMfB6JRVBJG/kFI6672DumGmHLzSJnxEZnffAuAUi+AXY9Es1C/h4v5F63HhXuFMzR8KHc1vgs/Fz97hSuEqMMkEbpBc+bMYc6cOZhMJk6cOCGJkLCb2A+HEZ23noP6LkS8ssre4dhE3vbtJL32Oobz5wHwHDmSMw/3YkXSKtYnrKfIVASAVtHSM7gnQ8KH0KtBLxy0DvYMWwhRh0giZCPSIiTs7fSx/YR80xudYubUPT/SpMPt9g7JJsx5eaTM+JiMpUsB0NWrR7133sHcOYJVZ1axIm4FB1IPWI/3cvLirsZ3MTR8KC18WtgrbCFEHSGJkI1IIiRqg62f3E+3rN846hRJy1c3wU1UP5MXu4Ok117DcO4cAF4jRxDwyito3d05nXWan+J+4pdTv5BakGo9J7peNFN7TJURZ0KIckkiZCOSCInaIDH+OAELu+GkGDkx4Guadb3H3iHZlDk/n5SPPyFj8WIAdEFB1Hvnbdx69gTAaDayPWk7K+JWsD5hPQazAR9nH6b1nEa3+t3sGboQopaSRMhGJBEStcWfsx6nx6XviXNoRpPJsSiam29i+PydO7nw2usYEixLi3jeO5zASZPQXvZ/72z2WV7c+CLHM46joPBE2yd4KvIptBqtvcIWQtRCsuiqEDeZJsPfIF91ItxwgqMbl9k7nGqh79SJxiuW4/3wQ6AoZP3vR04PvofcTZusx4R6hLJ40GJGNBuBisrnBz7niTVPkFaQZsfIhRB1lSRC5ZC1xkRtUy84hF1BowHQb5mGajLaOaLqodHrCfq//yN08dc4hoZivHiRxH88yYXJ/4cpKwsAZ50zb3Z9k/d7vo+LzoUdyTsY8fMIYpNi7Ry9EKKuka6x65CuMVGbpKVexHF2OzyUfA5GzyBi4OP2DqlamQsKSP3036QvWgSqii4ggKC3puDep4/1mPiseF7c9CInM06ioPBU5FM80fYJ6SoT4hYnXWNC3IT8/APZGzIWAN+dH2E2FNs5ouqlcXEh8NVJhC5ZgmOjRhhTUjj31NOcn/gixecscxCFeYaxZNAShjcdjorK3P1zeXLtk9JVJoSoEEmEhKhjIu99hUuqJ/XNSRz4ba69w6kR+g7tCVuxHJ/HHgNFIXvlSk4PHMjF9z/AmJGBi86Ft7q9xdQeU3HRubA9aTsjfxnJzuSd9g5dCFHLSSIkRB3j5eXDoSaWLrH6+/+NsSjfzhHVDI2zM4GvvEyjH75H37ULqsFA+sKFnOo/gEvz52MuLGRwk8F8e9e3hHuFk1aQxuOrH+fz/Z9jVs32Dl8IUUtJIiREHRR170SS8SVAvcTBn2baO5wa5dK6NSFffknDefNwat4cc04OKR/N4NTAQWQuX0GYeyhLBi1hSJMhmFUzs/fN5qm1T5FemG7v0IUQtZAkQkLUQW6ubpxs8TQAjY58RlF+lp0jqlmKouDWswdhP/6PetOmoatXD2NSEkmTJxM//F7M23fzTvd3eKf7Ozhrndl6YSsjfx7J7ou77R26EKKWkURIiDqq09BnSCQIb7I5/ON0e4djF4pWi9ewoTT5fSUBL72Ixt2douPHSRz/BAmPPcaAoqZ8c9c3NPZsTEpBCuNWjWP+wfk33FVWaCzEYDbY6CmurthUTGxSLBmFGdV6HyFudTJ8vhyy+ryoC/78cS49DkwmBz3aFw6i9/Szd0h2ZczI4NLnX5CxZAmqwZKoeNx9N24TnuCDcwv45fQvAPQI7sHUHlPxdva2nquqKllFWaQWpJJWkEZaQdpfX+enldmea8hFr9PTq0Ev7mh0B93rd0fvoLfJM5zMOMmPJ3/k19O/klmUSUuflnx797doFPm9VYjKkCU2bETmERK1WbHBSOLUDjRRz7In5FE6PDbT3iHVCsXnzpP66adk/2JJfBQHB7zuv5/Y/g145+hMikxFBOgDaOXbiksFl6xJjtFctUkqnbXO9GzQk34h/ejVsBeuDq6VOj+3OJffz/zO8pPLOZh28Ir97/d8n7sa31Wl2IS4VUkiZCOSCInabutvX9Ft57MU4ITx2b24+wbbO6Rao+DwYVI++oj8bdsB0Li7oz40jMlBfxJXkHDVczydPPF38cfPxQ8/F7+yX+v98XXxxc/Fj7NZZ1lzdg2rz67mfO556/mOGke6BXfjjtA76N2wNx6OV/++oaoqe1P28uPJH1l9djUFxgIAdIqO3g17M6zpMA5fOszcfXNp6N6Qn4b+hIPGwcafkBA3L0mEbEQSIVHbmUxmTrwXTUvzCfbUG02Hf3xh75BqFVVVyftzCykffUTR8eMAaAMDOTO6K7lRTfEKaIifWyD+LpYkx1HrWOnrH0s/xpqza1hzdg1nss9Y9+k0OrrU68IdoXfQp2EfvJ29SStI4+dTP7P85PIyx4Z5hjE8fDh3N7kbPxdLF2e+IZ+BPw4kvTCdf3X5F6Oaj7rhz0PYX3JeMivjVzK6+ehKtx6KipNEyEYkERJ1Qeza/xH952MUqzryn9yJV73G9g6p1lFNJrJ++YXUT/+NMSmpzD6Npyc6b2+03t5ofXzQenuh8/b562sfH8s+bx90Pt4oLi4oioJqNGLOzcWUk4M5Jwdjdjbnk05w+OxOTp07QEFmKvoi0BeCa5GCn6onXcknx0kl1wWK9Q6EBLemXZPuhDWIQOflhdbDA42nJ1oPDxStliVHl/D+jvfxd/Hnt+G/4aJzsdMnKGzlhQ0vsDZhLcObDuetbm/ZO5waZzQbmbJ1CoGugTzb/tlqu48kQjYiiZCoC8wmMwen9SLSeIB9/oNpN2GxvUOqtcxFRWQsXkz614sxXrwIVfgWqDg5oWi1mPOrdzJLjbs7Ll2iebfxQbb5XOKFqBd4rM1j1XrPm8Wu5F08v/F5HmvzWK36zPIMedz27W0Um4vRKBqW37Ocxl62+cXFaDby9ZGvaeXbiuh60Ta5ZnXYfG4zT6+zTP+xYdQGawuorVX057euWu4uhKhRGq0GY+/XYe0o2qT8RtrZw/iFtrZ3WLWSxskJ33Hj8B03DtVkwpSVhSk9HVNGBsb0DEwZGZgy0v/6Oj0dY2YGpnTL12pxMWpREZenT4pej9bNDY2HO1o3d8uf7h5o3N0sf3q4k60zcsZ4kWCtL75GZ0xZmZizszFlZmHKzrbEkZ2FOTPLmmCZc3LIW7OWF4ABDWHNmc+4N3w4ns5eNvkszKqZ5Lxk4rPiic+K50z2GcufWWdo5tOM2X1nV8vitYXGQnQaHTpN9fwIKjIV8ebWN8kqymLO3jkMChtEkGtQtdyrsjYlbqLYbFkj0Kya+ffefzOzz0ybXPvHkz/yw+8zyPN2YfHo5TRwb2DddyH3AusS1jGy2Uicdc43fK/c4lwmrJtAK99WTOo86Yr9qtlM3p9/4tK2LVovrzL7fo//3fr19qTt3N347huO50ZIIiTETaJD9/7siulMx+IdXFj+Bn7P/8/eIdV6ilaLzscHnY9PhY5XVRU1Px9jRgaYTGg8PNC6uaE4XL+I2Q+o6O/9qsGAKTsbw4ULZCz9hqxffqFVopFW3+RyYvMgmk54Bc+7BqE4Vq6eyWg28t3x79ibspf4rHjOZp+l0FR41WNTzqew5uwa7gy7s1L3uFy+IZ/4rHhOZZ0iLjOO05mnicuM40LuBZx1zkQFRhEdFE10vWia+zS32RQB8w/OJyHHUgxfbC7ms/2fXbMLquDQYc498wy+jz2Gz8MP2SSG8qw+uxqAfiH9WJ+4nnUJ69ifup9I/8gbum6hsZBf/5jN9P+aSPfIZYb7//HxqEUoikJmYSaPrXqM87nnMZgNNmkh++nUT+xJ2cOB1AM8H/U8TlqnMvvTZs8mbe5nOISEEPr11zgEBljjXJewznrctgvb7J4ISdfYdUjXmKhL9u/cTORvlm8qyfevI6hZRztHJGzBkJzMvtnvovl5HXpLYwK6oCB8xo7Fa+RItG4VK7idsWsGCw8vLLNNp9ER6h5KmGcYYZ5hNPJsxMHUg3x7/FuaeTfjh8E/oChKpeKNTYrlrW1vkZiTWOFzPJ086RzUmc5BnRnQaECZOZ4qIz4rnnt/vheD2cAjrR9h4eGF1+2CSvjHP8jbFAM6HWHfLcO5VasK3081mTDn5qL19LzusfmGfG5bdhtFpiK+H/w9S44uYUXcCjoGduTLAV9W+nO+3KLDizg34wOGb7X8SE/wg4JZr3N35GieXvs025K2AdA+oD1fDfyqyvcByy8EQ38ayums0wB8e9e3tPb7qwW66NQpTg8dBiVzeTmGNyH066/ReXuz+sxqXtz0IjpFh1E1EuASwNqRa2/o2ctT0Z/fMkOXEDeRyE492ebSC4C0X96wczTCVhyCguj4zixm/asNS3prKPR0wZicTMoHHxDXpw8pH3+CMTX1mtdYe3atNQkaHzGe2X1n89uw39j5wE5WDF3BJ30+4bkOz3FPk3t4pv0z6HV6TmScIOZcTKViNZlNTI2dak2CfJx96BTUifua38dr0a/x5YAv2ThqIz8M/oGXO75MrwaWeZeyirJYc3YN78W+xwMrH6DYVFzpz0lVVd7b/h4Gs4EewT2YGDWRvg37Wrugrqbo1ClLEgRgNHLh1cmoxde/t7mwkIxvv+XUoEGc6NqNnPXrr3vOpnObKDIVEeIeQnPv5kxoNwFHjSO7Lu5iy4UtlXrWy+UZ8vjvwf8SddKSBJm1GkLSQHllGu9tepNtSdtw1lq6w/an7r/h2cp3XdxlTYIAjqQfsX6tms0kvfkmGAzoO3VCFxhIcdwpEh8fj1pczB9n/gBgdIvROGmdSClIKXMte5BEqBxz5syhVatWdOrUyd6hCFEpXoPexKQqtMnZQuKBTfYOR9iIoij8o/tEfuqq4YknzTi//iKOYWGYc3K49MUXxPW9nXPPPkvGt8soPne+zLlns8/yry3/AmBsq7E81+E5ejXsRYhHyFXrdDydPBndYjQAXxz8gsp0HPxx5g/OpZ2iS6ILawb/xqbRm/hywJe81uU17mtxH52COuHr4ktzn+Y83PphZt8+m833bWbxoMU82/5ZfJx9SMxJZGX8ykp/Rr+e/pXY5FictE68Fv0aiqLwXIfn0CgaaxfU36UvXATAsTBHcvUaik6c4KfXH2TJ0SVsPreZfEPZgnhjRgapc+cS1/d2kqe8heFsApjNXJw6DfN1EqjVZyzdYv0b9UdRFIJcgxjTYgwAM3fPrPLSL4uPLEabkk5oKqDRELLgSwqdtTRLNNHok+Wgqrzb412aezfHrJr58/yfVbpPqWXHlwFY/+0cvXTUui9r+XIKdu1GcXGh/vvTCFnwJRpPTwoPHyZt8wY2JVq+Jw0NH0qHgA6ApXvMniQRKseECRM4cuQIO3futHcoQlRKy4gotrkPACDvjyn2DUbYVNf6XYkOiqZQY2J+o3ga//YrDWbPwiUyEtVgIGfNWpKnTOFUv36cunMgye+8y6W1q5i06p/kGnLpENCBf0b9s0L3erjVwzhpnTiQeoCdyRX7Pmgym/huwyymLjIxcXEOBU+9jPHSpeue56BxINI/kifaPsEjrR8BLF09lUnAsoqy+GjXRwA8GfmktVC4iVcT7mlyD2BJNi6/pjE9nYwVywFY0t3EF/0t28N/Ociyn6bx9LqneWb9M5baMFUl4/vvibu9H2n/noUpPR2H+vUJnPwquoAADOfOkfF1+aM18w35bD6/GYD+of2t2x+PeBw3BzeOZxxn+s7p1ok1r0U1GFBNJutzLzy80Noa5NKhPe6do3H95D2KtdD5hMpLjnczoNEAbmtwGwCxR1eTMuNjis+cKXNds2rmyKUj7L64m90Xd3Mw9SAms6nMMWkFaaw7a6nxebT1o8BfiZBqNHJ2+nsA+Ex4CofgYJwaN8ZjoKXO7NRv31JsLibMM4zm3s3pWr8rgLXbzl4kERLiJhQ05E2KVS0t8vdwZmflf7MWtddzHZ4DLK0fp7Pjce/Xj9Bvv6HRDz/g99yzuHToAFotxWfOkLFkCSnPPM9rbx7nnW8V3j7dDtOxkxjT0jBcvIjhwgWKExMpPnOGolOnKDx+gsKjRyk4eAivQi3DwocBllahitjw46dMmHWWkJJeusL9Bzgz+j6KTsdX+PnubXYvep2euMw4tl7YWuHzZu6ZSXphOk08mzC21dgy+8rrgjrwxXQUg5GT9SCk+x088fxCsnq0QavCpFUu6M0O7EzeyZaTa7nw8isk/+sN1Px8nFq0oP5HH9Fk9Sp8xo7F//nnAUj7z38shfRXEXMuhiJTEQ3dG9LCp4V1u5ezF0+3swwlX3J0CcN+Gsbmc5aEyWA2sO3CNqbFTuPtbW9zOvM0hvPnOdG9B4lPP82lgkv8a8u/yDXkcttZy/xS7n36ANCszxDMPaIAGJhuSQp7NbR0m/v+sJlL8+Zx9rHHMF66RJ4hj6VHlzJkxRBG/zqaR/54hEf+eIT7V97Pp3s/LfMcP578EaNqpL13BAN/Tub2fWZOZJzAYDaQFLMax6wCsl0gfsBfdValMWm37gVVZUCjASiKYk2EdibvxGCq3kWMr0VGjQlxEwpv2opN3vfQK3M5prVvQ8eBUA3FiKLmtfVvS9+GfVmfuJ7Ze2fzSZ9PUBQFlzatcWnTGv+nn8aUk0Pe9u0c/O0rjNt2EZAFzeMN5M/6gvhZFUtqFAcH7ht2F2sDtcQmxXIg9QBt/dte9VhVVUlbuIB60+ehUSEnPIjWr79P0r/+hSExkTNjxtBw9iz0FSg18HD0YHjT4Sw+uphFhxfRPbj7NY/PXrWac9OnMujSRfprwMM1lbOzB6E4OKDR6/F57FGC7rqLMS3GsOjIImbunkm3+t3YlbAV8/c/4QLED4zgg17TcdA4YPzwC07fPRifpEu8fjSSz/0OoT72EtlpxaDV4v/8P/EdNw5F81c7gufQIaR//TVFR4+SNmcuQa+/dkWcpaPF+of2v6Iw+KFWD9HArQFTd0zlfO55nl73NO0D2hOXGUdOcY71uP+d/B+vH2pKm+xs8jbF8PHUgWwIL8ClCMLjiwBwK0k6ABr1GUzypt0UxO6AZyDCLwIfZx9anUoBwHghiWNPPsbT96SQYc4FQK/TE6APwKyaSchJYPGRxYxpPoZ6bvXIKc7h22PfAvCPXV4Yv1vOOA3sbVxEfFY8l5Z/gxcQ20LB4dIBohta/u70XbqguDjjlllIo4ta+jbsC0Az72b4OPuQXpjO/tT9dAyyz+AOaRES4iYVNuxNClRHmhQdJe7PH+wdjrChZ9s/i4LC2oS1HEo7dMV+rbs7iR3q82zUYZ55Ssuef48j8PXXcevTB41ebzlIp0NxckKj16Nxd0fr5YXW1xddQAA6f39Ug4Hi71Yw6zMDj6wxsWTz7KvGYi4qIunVyaR98CEaFbZGOtH62x9x7RJNo2Xf4hIZiTkri4THxpH1y68Ver4HWz2IVtGyLWkbx9OPX/UYU04OFya9yvl//hPl/EXcCsErHzSp6RjOnaM4Pp7Cw4e58NLLZP3ya5kuqA93fsiy2c/imQfZ3k48+c+F1nXcdN7eBL1pGWgQ/utBpi4y4ZdWjNHPi9Cvv8Jv/PgySVBucS4x5zdT8KRl+ZOMb7+lKL5sC1i+Id/aytO/UX+upk9IH34a8hMPt3oYraJlb8pecopz8HH2YXjT4fRu2Buz2YRfzGHrOcNW59DSrQn/9X4OxWDEITQEx7Aw637XLpZJFQv27cNcUIBG0dDftSMhqaAqoLi5oT14gjE/ZxFBMNO0I/nJ/BTLe3zJr8N+pVNQJwxmA3P2zMaQksKsPf8mtSCVnukB+PxgqfXRmWHAHjNHkw/ivGUfAFtbKuxO2W2NQ+PkRGGH5gD0PutKc+/mpH+9mNzVa4muF00jj0bkGfKu9U+iWkmLkBA3qZDQMDb4j6RP2hIcNr0H3e8FjfzuczMI9w5ncJPB/HzqZz7d8ynz+s8rsz+rKIsXN76IwWygT0hf7u/zIoqi4PPgA6iqet2hyqqqkh8bS+qs2RTs3s2gXVC8bzPH9r1Ck2dewiHAMieM4eJFzj37HIUHDmDSwFd9NbT4x7O4ulmGvut8fAhZtJALr0wiZ/VqLrz8MoZzifg++eQ1Ywh2C+aO0Dv448wffHXkK97r8V6Z/Xk7dnDh1VcxXkhCVRSWd4V97T2Z03sW7ooLGA2oBgNZP/9C5vffc+HVVwl2/oRH2zzKrL2zWHzkaz7aZql9afT4BJyc9GWu79G/Pzl33UX2b7/hAOwOV/h1jA9L2pWd6yffkM+41eM4cskyampSuEJUnJFfXhzJn8/2oKVPS1r6tiQ5L5lCUyEN3BrQ0qdluc+td9DzcqeXuafJPcQmxRLhH0Fbv7bWSS33rf0Gp8y3KXSAfGeFgCyV2Wl3Yjx9iizAvXefMp+rQ2gousBAjBcvUrB3L67dutE72TJnVmKwE9sGN2DEf47R+6BK74NngbNkAIYtsTT8z2c83+F5Hlj5AB7/XUFc7I80b6gQ2VXh6T+NYDbj1DScopNx3LFX5cCa32mWbyTTFY40VHBOPYDBbLAmmPubOdJ5C3Q9rePSZ5+RNms26HRMWfM7+tsaYE/yXVGIm1jzEa+To7oQaozn+PpF9g5H2NDT7Z5Gp9GxPWk7sUmx1u1m1cz//fl/nM89T0P3hrzb490yPxwrMl+Loii4dulC6OKvCVnwJclNvHE0gvrdL5y6oz8Xp00jZ8MG4keMsCRB7i68N1pDbE8/7isZBVVK4+xM8MxP8HnMMolf6qf/Jun111EN164JGdvaUuezMn4lKfmWrhxzUREXp39IwthHLElQ/QDefFDLt720PHrXvwiI6GjpImzXDn2nTgS9NQXPYcPAZOL8xBe5Ny0MPxc/IuNVy/ByvR6/Ufdd9f5B/3odr5Ej8Pq/V/jPA94cNibw6+m/WrRMZhOTN0/myKUj6HV6/F38+bqvBpMCrY/kceHPtczeN5sJ6ybwzvZ3gL9Gi/1d8blzXJz2Psa0NADriLr2Ae3LzOwduNnSOqbr24MGL78KQMbn88jZuBEo2y3219+jpVUoL3YHAA2OWorXd4UU8z+vOJbcWTLLtEZjbU3KjYnBkJREW/+2DPTvzR17LKPZWiWqvPadGe2FFHT16hH69dcUB/ngVggRCyy1VwfauOLu7EmBscDammdWzfzgF48Z8D6TbkmCAIxG8n786aqff02SREiIm1j9oPrsrP8gAG7bPkS1Y0GisK1gt2BGNhsJwKd7PrWOhpp/cD4x52Jw0jrxce+P8XCs+kSwiqLg2rUrQV/9l3fu03AiWEEtKiJ90Vece+ppTKlpODYNZ9oT3hxqpOGxNo+hd9BfeR2NhsBXXibwjX+BRkPW/34k8ZlnrCOfrqaNXxs6BHTAaDay9OhSihMSODNyFOlffgmqiuu9Q/m/x5051gAGhQ1iUONBV71vvXffwX3gnWAwkPrCy3zqNZ6njzUEwHvkCLTu7le9v9bLi3rvvEO9hx9lXMTjAMzdN9c6v9Enuz9hfeJ6HDQO/OeO/7B+1Hp+/udunO61TGj62u96nj/fhmaujdEoGhw1jgxpMuSq90qa/H+kL1pE6qefXnU/gLm4mOw/LHPwNB79KCEjHsQ5IgJzfj7mrCw07u7oozpccZ4+ugsA+du3o5rNFG23JET7wyw//nv9cxrhmzbSfM9umvy+0lLHZTaTudwymm78xRY4G+CCN2zo5Aw6HWg01J/6HlovL5zH3AuAe8lgN3PfbrQPaA/A7ouW7rEDqQc4o8vkdPBfSZ1zmzYAZC777rpJcXWTREiIm1zEiFdJV90JNp3n6O8VK5QVdcMTbZ/ARefCwbSDrE9cz/ak7czZNweA16JfKzM66Ua09G2JV49evP6Qho0Te+ESaekicu/fn/3vjuGAYwq+zr6Maj7qmtfxuf9+Gsydg+LiQt6mGNLmzLnm8aVD6VccXkbC009TdOIEWl9fGsydw7xBOk4ZLlDPtR6vdbmyOLmUotUSPH06bn36oBYV4TjpI7z3nwWNBu+HKracxn0t7sPfxZ8LeRf438n/8d3x71h0xNLC+m73d60/+J20ToRNnIxD/fo4pufQ7at9vD8nh9W8wIahq646s3Ve7A7yS6ZpyV61uty5iHI3bcKclYUuIAB9dLQluZz8qnW/W8+eV13qxTW6MwAFhw5RsGcPpkuXMDs7ciLYMkXCnY3uxCEwEI2zpWXIa+QIALJ++B+q2Yzu1w0ArO2gIfStdwlfv47Gv/6Ka1fLiK+w+8eRX7K6xiV3iOg7wvp57Lm4B4ANiZZrpHW31Am59rqN0MVfo/X1xZiSQs6GDdf/S6hGkggJcZPz9/Vjb6ilW8J39yeYi6++tpSoe/xc/HiwpaXFb+bumUyKmYRZNTO86XCGNR1m03s90fYJUBS+cInF6b+fEL5pEwEff8h/Ti4EYFzEOFx0Lte9jnvv3tR7+20A0j77D7mby5/cr1fDXjTyaMS9K7MwxJ1C6+dH2I//Y3sTEyviVqCgMLXH1Ou2eikODgTP/ATXbt1QCyxNF+533IFjg4rVprjoXCzPD8zeO5upsVMBeKbdM1e0ROl8fGj86y8EvDoJnb8/xqQk0qd+wMXBI6+Yt0dVVdJmzbK+N2dnk7d581VjyP75ZwA8Bt+NorW0rOg7dMBz6FDAMnLtahyCg3EICQGTidRPLbNru0d3Zf39Mbzc6eUrjnfv3x+NhweGCxe49N//Unj4MIqDAxNf+5m7Gt+FQ0AATo3/Ksh2dPdkb/dAALZFONK5fheiAi3D9ksLvv+It7RkBT70KKFLl9Bw9mw0zs54jbAkXRlLv7lq7DVFEiEhbgFR977IRdWHQDWVw79efakBUTc90uYR3B3dOZN9hvTCdFr4tGBy58k2v0+7gHZ0DOyI0WzkqyNf4RAYwIpTK0jKS8Lfxd/aTVcRnoPvxuu+0aCqXHjlFQzJyVc9TqNoeOZSe/rtUzErEPT+VNLdYMrWKYAl+arokGuNkxMNZs+ytKY4OOA7fnyF4wW4t+m9BLsFk12cjUk1cU+Te6zJ0RX30uvxfeQRmqxdQ+Ab/0JXrx7G5GTOPfsc5vy/ZqrOj91B/q5dKA4OeAyyJFRZv145ss6UmUnORssoLc97yiY89d57l/B1a3G77bZyY3eNttQJlbY8uXXvho/z1Rca1jg74zl4MACpn8wELEmjf/0m5V4/+f4+vDdaQ/KY3jhqHWnt2xonrRMZRRk8vvpxLuRdwN/Fn9tCe6Pv0MHacuU9ehRoNORv307RqVPlXr+6SSIkxC3Ay9OTQ+H/ACD44GyMBTnXOUPUFR6OHtbVxN0d3Pm498c465yr5V7j21qShx9O/EByXjLzDlpGq42LGFfpewZOnoxzq1aYMjI4/8LEq9aJFCckEPqZZULQ5V0VtjbI47Utr5FdnE1Ln5Y8Hfl0pe6p0esJWfAlTbduwaVN6+ufcBkHrQP/7GCZlbtTUCemdJ1y3cJzjZMTPvffT6Nl36L196Po5EmS3njTOlN12mxL0bDXyJH4jLP8Heau34ApN7fMdbL/+AMMBpxatMC5ebMy+xStFofg4GvGoS8pmC7l2v3aczOVdo9hthRJe426dpfn2LaPEdBnAE93skz26aB1IMIvAoAjl47grHVmVt9ZuDm6lTnPoX59S4G3TkfB/gPXvEd1kkRIiFtE5+HPkUggPmoWR376yN7hCBsa22osE6Mm8kX/L2jo3rDa7tO1Xlda+7am0FTI+NXjSc5LJsAlgBHNRlT6WhonJ4I/nYnG3Z2CvXtJ+fiTMvvV4mLOT3wRNS+PzOb1+L6nhilbpxCbFIuz1pn3b3sfB+2VNTHXo2g05RZIX8/AsIH8NOQnPr/j80rd2yEggAaffAJaLdm//krG4iVlWoN8nxiPc6tWOIaFoRYVkbN2rfVc1Wwm83vLPGCe99xTpbhdO3e2fq0LDMSx8ZW1SpdzbtHCWszsEBqCPrrzNY9v6NGQj3t/TBOvv1qNSuuEFBTe7/l+mdXpLxf4yss03bAer+G27cqtDEmEhLhFuLvqOdnqGQAaHZtHUW66nSMStuKgdeDRNo/Sxq9Ntd5HURRrq9CZ7DMAPN72cZy0TlW6nmPDhtSbapkjKH3BAnLWrbPuS5nxMYWHDqH19KTJzNnodE7WSfde7vQyjT2v/cO8ujT2amydG6cy9B07EviKpSbn4gcfkPzWW4CltcUhKAhFUfC4+y4Asn/9zXpe+qKvLHU6ej2eg++uUsw6f38cwy1Jimv37hWaQsHv6adQHBzwf/rpCh3/d8PCh9HKtxWvd3md20NvL/c4x9BQdP7+lb6+LUkiJMQtpNuQJzlNAzzI4/iPU+0djqiD+jTsQ7hXOACB+kDubXrvDV3P44478HnkEQAuvDqZ4sREcjZsIH2RZVRWvWlTCQhrxT3hltaQXg16VaoeqTbxfvhhPAYNBKOR4vh4a2tQKc+7LIlQ3rZtGNPSKDp5ktRPLC1lgZMm3VDC4D1yJDg44HXv8Aod7963Ly0OHsBzyNWLsK+noUdDlt297LojCWuDKiVCiYmJnDt3zvp+x44dPP/883zxxc0zNHfOnDm0atWKThVYG0eIusLZyZGE9i8CEH76awqzr78yuBCX0ygaXu74MgH6AF7t/CqOWscbvmbAixNxadcOc04O5559jqRXLcXePmMfxr2vZV2qlzu+zNQeU5l+2/QqtVDUBoqiUO+dd3BsYmmd8Ro1CofAQOt+x0aNcI6IAJOJrF9+5fykSajFxbj16oXXqBtL/nzGjqXlwQPoo6Ju6Do3I0UtnYWrEnr27MkTTzzBQw89RHJyMs2bN6d169acOHGC5557jjfeeKM6YrWL7OxsPD09ycrKwsOj6hOTCVFbFBtMXHgvgkac52CPOUT0e9DeIQmBISmJ+GHDMWVmAuDcujWh3yxF43jjiVZtY7iYQs6qP/AaMeKvtd9KpC9axMVp74ODAxgMaL28aPzLz3bvPqqLKvrzu0otQocOHaJzSfHVd999R5s2bdi6dStLly5l4cKFVQpYCFEzHB20JPtaWjrzTsTYORohLBzq1aP+h9NBUdC4uhL8ycc3ZRIE4BAYgM/DD1+RBAG4DxxoWROwZBRd0JQpkgRVsyolQgaDAScnS3Hc2rVruaekkr1FixYkJSXZLjohRLVwatIDAJ+03dc5Uoia49azJ2ErVtD4t19xDAmxdzh24RAQgGsXy7IYHvcMxuPOAXaO6OZXpUSodevW/Oc//2Hz5s2sWbOGO++8E4ALFy7g6+tr0wCFELbXOOoOAJqYTpGckmLnaIT4i3PzZjgEBdk7DLsKevstAie/Sr0pU+wdyi2hSonQBx98wOeff07v3r0ZM2YMkSXrzvz888/WLjMhRO3lGdiIZE0QWkXlxK719g5HCHEZxwYN8Bk79qpdZ8L2dFU5qXfv3qSlpZGdnY23t7d1+xNPPIFe/uKEqBPSfKMISv2NgrjNwH32DkcIIeyiSi1CBQUFFBUVWZOgs2fPMnPmTI4fP05AQIBNAxRCVA99eE8AAtJ3YTZXevCoEELcFKqUCA0ZMoSvvvoKgMzMTKKjo5kxYwZDhw7ls88+s2mAQojq0aB9PwBaqXEcTZQ6ISHEralKidCePXvo2dPy2+QPP/xAYGAgZ8+e5auvvuLf/5aVrYWoCxz9w8nU+uCkGInbt8ne4QghhF1UKRHKz8/HvWTRutWrVzN8+HA0Gg1dunTh7NmzNg1QCFFNFIUMP8sss0Wn/rRzMEIIYR9VSoTCw8NZsWIFiYmJrFq1iv79+wOQkpIisy8LUYe4NesFQL3MvRQUm+wcjRBC1LwqJUJvvPEGL730Eo0aNaJz58507doVsLQOtW/f3qYBCiGqj18rSyLUXjnBjtNSJySEuPVUKREaMWIECQkJ7Nq1i1WrVlm333777XxSslKuEKL2UwJbk69xw00p5NSBrfYORwghalyV5hECCAoKIigoiHPnzqEoCsHBwTKZohB1jUZLjn8U+oubMJzeAtxr74iEEKJGValFyGw28/bbb+Pp6UloaCghISF4eXnxzjvvYDabbR2jEKIauTe3dI81yttPSnahnaMRQoiaVaUWoddee43//ve/vP/++3Tv3h1VVdmyZQtTpkyhsLCQ9957z9ZxCiGqib7pbRADnTTH2HgyleFRDe0dkhBC1JgqJUKLFi1i/vz51lXnASIjIwkODubpp5+WREiIuqReJAaNEz7mXE4e3g2SCAkhbiFV6hpLT0+nRYsWV2xv0aIF6enpNxyULSUmJtK7d29atWpF27Zt+f777+0dkhC1i86RvIAOAJjPbEFVZbkNIcSto0qJUGRkJLNnz75i++zZs2nbtu0NB2VLOp2OmTNncuTIEdauXcsLL7xAXl6evcMSolZxa2qZKb6l4RDHL+bYORohhKg5Veoamz59OnfddRdr166la9euKIrC1q1bSUxMZOXKlbaO8YbUq1ePevXqARAQEICPjw/p6em4urraOTIhag9dWA/YPJ3OmmP8djyVFkEyMaq9JaVns+4/E9G37M/wYaPsHY4QN60qtQj16tWLEydOMGzYMDIzM0lPT2f48OEcPnyYBQsWVOpaMTExDB48mPr166MoCitWrLjimLlz5xIWFoazszNRUVFs3ry5KmGza9cuzGYzDRtKDYQQZTTohFnRUV9J5+jxw/aORgBHVi/gweLvaX3wA3uHIsRNrcrzCNWvX/+Kouj9+/ezaNEivvzyywpfJy8vj8jISB599FHuvffKOUyWLVvG888/z9y5c+nevTuff/45AwcO5MiRI4SEhAAQFRVFUVHRFeeuXr2a+vXrA3Dp0iUefvhh5s+fX5nHFOLW4KinKKAtLhf3oEvcRqHhLpwdtPaO6kpFORTNvxONyYBDu5EQMQq8Q+0dVbXQnbX8whdovmjnSIS4uVU5EbKVgQMHMnDgwHL3f/zxx4wbN47HH38cgJkzZ7Jq1So+++wzpk2bBsDu3buveY+ioiKGDRvG5MmT6dat23WPvTypys7OruijCFGnOTfpARf30F49yu6zGXQP97N3SFdI3fc7/qmHLG/Wvwvr38XcsAuayNHQaijofewan63kFxlo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RPR53aSkpH6Nw263k5GR0a9zhBACZGpMCHEGMjIyrD/x8fFommbdb21tJSEhgT/+8Y8sW7aMyMhINm3aRFVVFd/4xjfIysoiOjqa2bNn88ILLwRdt/PU2MSJE/nJT37CjTfeSGxsLNnZ2Tz99NPW852nxrZt24amafz1r39l4cKFREdHs3Tp0qAgDeDhhx8mLS2N2NhYbr75Zn7wgx/0ms2pqanh2muvJTU1laioKKZNm8Zzzz0HwKRJkwA455xz0DSNZcuWWec999xzTJ8+ncjISPLz83nqqae6jP3FF19k6dKlREZGMnPmTLZt2xbS6wohzowEQkKIIfX973+fu+66i/3793P55ZfT2trKggULeOONN9i7dy+33nor119/PR999FGv13niiSdYuHAhe/bs4Y477uD222/nwIEDvZ5z//3388QTT7Br1y4cDgc33nij9dwf/vAH1q1bx2OPPcbu3bvJzs5mw4YNvV7vgQceYN++ffzlL39h//79bNiwgZSUFAB27twJwNatWyktLeVPf/oTAM888wz3338/69atY//+/fzkJz/hgQce4He/+13Qtb/3ve9xzz33sGfPHpYuXcpVV11FVVVVn68rhDhDuhBCDILnnntOj4+Pt+4XFhbqgP6LX/yiz3OvuOIK/Z577rHuX3TRRfq//du/WfdzcnL06667zrrv9/v1tLQ0fcOGDUGvtWfPHl3Xdf3dd9/VAX3r1q3WOW+++aYO6C0tLbqu6/rixYv1O++8M2gc5513nj537twex3nllVfq3/rWt7p9rvMYTBMmTNCff/75oMceeughfcmSJUHnPfroo9bzbW1telZWlv7YY4/1+bpCiDMjGSEhxJBauHBh0H2fz8e6deuYM2cOycnJxMTE8Pbbb1NUVNTrdebMmWPdNqfgysvLQz5n3LhxANY5Bw8e5Nxzzw06vvP9zm6//XZefPFF5s2bx7333suOHTt6Pb6iooLi4mJuuukmYmJirD8PP/wwR48eDTp2yZIl1m2Hw8HChQvZv3//gF5XCBE6CYSEEEPK7XYH3X/iiSd48sknuffee3nnnXcoKCjg8ssvx+v19nqdzkXWmqbh9/tDPsdc4RZ4TudVb3ofi2hXrlzJiRMnuPvuuykpKeGSSy5h7dq1PR5vvtYzzzxDQUGB9Wfv3r18+OGHvb5W4Pj6+7pCiNBJICSEGFbbt2/n6quv5rrrrmPu3LlMnjyZw4cPD/s48vLyrLoe065du/o8LzU1ldWrV7Np0yZ+8YtfWEXbTqcTUBkvU3p6OuPHj+fYsWNMnTo16I9ZXG0KDIza29vZvXs3+fn5fb6uEOLMyPJ5IcSwmjp1Kq+88go7duwgMTGRn//855SVlTF9+vRhHcd3vvMdbrnlFhYuXMjSpUt56aWX+Oyzz5g8eXKP5zz44IMsWLCAmTNn4vF4eOONN6xxp6WlERUVxVtvvUVWVhaRkZHEx8fzox/9iLvuuou4uDhWrlyJx+Nh165d1NTUsGbNGuva69evZ9q0aUyfPp0nn3ySmpoaq7i7t9cVQpwZyQgJIYbVAw88wPz587n88stZtmwZGRkZrFq1atjHce2113Lfffexdu1a5s+fT2FhIatXryYyMrLHc5xOJ/fddx9z5szhwgsvxG638+KLLwKqrueXv/wlv/nNb8jMzOTqq68G4Oabb+bZZ59l48aNzJ49m4suuoiNGzd2yQg9+uijPPbYY8ydO5ft27fz+uuvWyvDentdIcSZkc7SQghhuOyyy8jIyOD3v//9sL2mdKQWYmTJ1JgQYkxqbm7m17/+NZdffjl2u50XXniBrVu3smXLlpEemhBiGEkgJIQYkzRNY/PmzTz88MN4PB7y8vJ45ZVXuPTSS0d6aEKIYSRTY0IIIYQYs6RYWgghhBBjlgRCQgghhBizJBASQgghxJglgZAQQgghxiwJhIQQQggxZkkgJIQQQogxSwIhIYQQQoxZEggJIYQQYsySQEgIIYQQY9b/B4R1jQ6pnU84AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "\n",
    "with open(\"./DeePMD-kit_Tutorial/01.train.finished/lcurve.out\") as f:\n",
    "    headers = f.readline().split()[1:]\n",
    "lcurve = pd.DataFrame(\n",
    "    np.loadtxt(\"./DeePMD-kit_Tutorial/01.train.finished/lcurve.out\"), columns=headers\n",
    ")\n",
    "legends = [\"rmse_e_val\", \"rmse_e_trn\", \"rmse_f_val\", \"rmse_f_trn\"]\n",
    "for legend in legends:\n",
    "    plt.loglog(lcurve[\"step\"], lcurve[legend], label=legend)\n",
    "plt.legend()\n",
    "plt.xlabel(\"Training steps\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8009ad0a-9902-42d3-b280-caee92cbdf10",
   "metadata": {},
   "source": [
    "### Freeze a model\n",
    "\n",
    "At the end of the training, the model parameters saved in TensorFlow's checkpoint file should be frozen as a model file that is usually ended with extension .pb. Simply execute"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "b20d368a-135c-4314-ae4c-47bf1f28c4d7",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/compat/v2_compat.py:107: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n",
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "DEEPMD WARNING The following nodes are not in the graph: {'fitting_attr/aparam_nall', 'spin_attr/ntypes_spin'}. Skip freezeing these nodes. You may be freezing a checkpoint generated by an old version.\n",
      "DEEPMD INFO    The following nodes will be frozen: ['descrpt_attr/rcut', 'model_attr/model_version', 'o_atom_virial', 'model_attr/tmap', 'model_attr/model_type', 'o_force', 'o_energy', 'train_attr/min_nbor_dist', 'model_type', 't_mesh', 'fitting_attr/daparam', 'train_attr/training_script', 'fitting_attr/dfparam', 'o_atom_energy', 'descrpt_attr/ntypes', 'o_virial']\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/entrypoints/freeze.py:370: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.convert_variables_to_constants`\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/entrypoints/freeze.py:370: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.convert_variables_to_constants`\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/framework/convert_to_constants.py:925: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.extract_sub_graph`\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/framework/convert_to_constants.py:925: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.extract_sub_graph`\n",
      "DEEPMD INFO    1222 ops in the final graph.\n"
     ]
    }
   ],
   "source": [
    "## Navigate to the DeePMD-kit_Tutorial/01.train/ Directory to Freeze the Model\n",
    "! cd DeePMD-kit_Tutorial/01.train.finished/ && dp freeze -o graph.pb"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b23f3c9-5809-4a65-9126-f9e6d2f3a10b",
   "metadata": {},
   "source": [
    "and it will output a model file named `graph.pb` in the current directory. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3de9a2d0",
   "metadata": {},
   "source": [
    "### Compress a model\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8089fe4d",
   "metadata": {},
   "source": [
    "To enhance computational efficiency with DP models, compression significantly accelerates DP-based calculations and reduces memory usage. We can compress the model by running:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "bb71bdd0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/compat/v2_compat.py:107: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n",
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "DEEPMD INFO    \n",
      "\n",
      "\n",
      "DEEPMD INFO    stage 1: compress the model\n",
      "DEEPMD INFO     _____               _____   __  __  _____           _     _  _   \n",
      "DEEPMD INFO    |  __ \\             |  __ \\ |  \\/  ||  __ \\         | |   (_)| |  \n",
      "DEEPMD INFO    | |  | |  ___   ___ | |__) || \\  / || |  | | ______ | | __ _ | |_ \n",
      "DEEPMD INFO    | |  | | / _ \\ / _ \\|  ___/ | |\\/| || |  | ||______|| |/ /| || __|\n",
      "DEEPMD INFO    | |__| ||  __/|  __/| |     | |  | || |__| |        |   < | || |_ \n",
      "DEEPMD INFO    |_____/  \\___| \\___||_|     |_|  |_||_____/         |_|\\_\\|_| \\__|\n",
      "DEEPMD INFO    Please read and cite:\n",
      "DEEPMD INFO    Wang, Zhang, Han and E, Comput.Phys.Comm. 228, 178-184 (2018)\n",
      "DEEPMD INFO    Zeng et al, J. Chem. Phys., 159, 054801 (2023)\n",
      "DEEPMD INFO    See https://deepmd.rtfd.io/credits/ for details.\n",
      "DEEPMD INFO    installed to:         /root/miniconda3/envs/deepmd\n",
      "DEEPMD INFO    source :              v2.2.7\n",
      "DEEPMD INFO    source branch:         HEAD\n",
      "DEEPMD INFO    source commit:        839f4fe7\n",
      "DEEPMD INFO    source commit at:     2023-10-27 21:10:24 +0800\n",
      "DEEPMD INFO    build float prec:     double\n",
      "DEEPMD INFO    build variant:        cpu\n",
      "DEEPMD INFO    build with tf inc:    /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/include;/root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/../../../../include\n",
      "DEEPMD INFO    build with tf lib:    \n",
      "DEEPMD INFO    ---Summary of the training---------------------------------------\n",
      "DEEPMD INFO    running on:           bohrium-21213-1088639\n",
      "DEEPMD INFO    computing device:     cpu:0\n",
      "DEEPMD INFO    Count of visible GPU: 0\n",
      "DEEPMD INFO    num_intra_threads:    0\n",
      "DEEPMD INFO    num_inter_threads:    0\n",
      "DEEPMD INFO    -----------------------------------------------------------------\n",
      "DEEPMD INFO    training without frame parameter\n",
      "DEEPMD INFO    training data with lower boundary: [-0.92929175 -0.99957951]\n",
      "DEEPMD INFO    training data with upper boundary: [1.97058099 1.10195361]\n",
      "DEEPMD INFO    built lr\n",
      "DEEPMD INFO    built network\n",
      "DEEPMD INFO    built training\n",
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "DEEPMD INFO    initialize model from scratch\n",
      "DEEPMD INFO    finished compressing\n",
      "DEEPMD INFO    \n",
      "\n",
      "\n",
      "DEEPMD INFO    stage 2: freeze the model\n",
      "DEEPMD WARNING The following nodes are not in the graph: {'spin_attr/ntypes_spin', 'fitting_attr/aparam_nall'}. Skip freezeing these nodes. You may be freezing a checkpoint generated by an old version.\n",
      "DEEPMD INFO    The following nodes will be frozen: ['train_attr/min_nbor_dist', 'o_energy', 'descrpt_attr/rcut', 'o_force', 'model_type', 'fitting_attr/daparam', 'model_attr/tmap', 'o_atom_energy', 'descrpt_attr/ntypes', 'o_virial', 't_mesh', 'model_attr/model_type', 'fitting_attr/dfparam', 'o_atom_virial', 'train_attr/training_script', 'model_attr/model_version']\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/entrypoints/freeze.py:370: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.convert_variables_to_constants`\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/entrypoints/freeze.py:370: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.convert_variables_to_constants`\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/framework/convert_to_constants.py:925: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.extract_sub_graph`\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/framework/convert_to_constants.py:925: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.compat.v1.graph_util.extract_sub_graph`\n",
      "DEEPMD INFO    858 ops in the final graph.\n"
     ]
    }
   ],
   "source": [
    "## Navigate to the DeePMD-kit_Tutorial/01.train/ Directory to Compress the Model\n",
    "! cd DeePMD-kit_Tutorial/01.train.finished/ && dp compress -i graph.pb -o compress.pb"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2882c201-0e85-46d0-94f8-e055a540b6fb",
   "metadata": {},
   "source": [
    "### Test a model\n",
    "\n",
    "We can check the quality of the trained model by running\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "5d201246-b110-4e63-a09b-ad7308bc1367",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/compat/v2_compat.py:107: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n",
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/utils/batch_size.py:62: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.config.list_physical_devices('GPU')` instead.\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/utils/batch_size.py:62: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.config.list_physical_devices('GPU')` instead.\n",
      "DEEPMD WARNING You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.\n",
      "DEEPMD INFO    # ---------------output of dp test--------------- \n",
      "DEEPMD INFO    # testing system : ../00.data/validation_data\n",
      "DEEPMD INFO    # number of test data : 40 \n",
      "DEEPMD INFO    Energy MAE         : 1.473845e-03 eV\n",
      "DEEPMD INFO    Energy RMSE        : 2.007936e-03 eV\n",
      "DEEPMD INFO    Energy MAE/Natoms  : 2.947689e-04 eV\n",
      "DEEPMD INFO    Energy RMSE/Natoms : 4.015871e-04 eV\n",
      "DEEPMD INFO    Force  MAE         : 2.146239e-02 eV/A\n",
      "DEEPMD INFO    Force  RMSE        : 2.748797e-02 eV/A\n",
      "DEEPMD INFO    Virial MAE         : 2.879183e-02 eV\n",
      "DEEPMD INFO    Virial RMSE        : 3.817983e-02 eV\n",
      "DEEPMD INFO    Virial MAE/Natoms  : 5.758366e-03 eV\n",
      "DEEPMD INFO    Virial RMSE/Natoms : 7.635965e-03 eV\n",
      "DEEPMD INFO    # ----------------------------------------------- \n"
     ]
    }
   ],
   "source": [
    "! cd DeePMD-kit_Tutorial/01.train.finished/ && dp test -m graph.pb -s ../00.data/validation_data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f48e0a9-644f-4588-b9f3-cc115851a1ed",
   "metadata": {},
   "source": [
    "The correlation between predicted data and original data can also be calculated."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "be03c8da-e4f9-439d-bb22-800b651a7737",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/tensorflow/python/compat/v2_compat.py:107: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, TF_INTRA_OP_PARALLELISM_THREADS, and TF_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/utils/batch_size.py:62: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.config.list_physical_devices('GPU')` instead.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-03-24 23:05:17.177887: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE4.1 SSE4.2 AVX AVX2 AVX512F FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
      "2024-03-24 23:05:17.179243: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.\n",
      "2024-03-24 23:05:17.197330: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:354] MLIR V1 optimization pass is not enabled\n",
      "WARNING:tensorflow:From /root/miniconda3/envs/deepmd/lib/python3.10/site-packages/deepmd/utils/batch_size.py:62: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `tf.config.list_physical_devices('GPU')` instead.\n",
      "WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.\n"
     ]
    }
   ],
   "source": [
    "import dpdata\n",
    "\n",
    "training_systems = dpdata.LabeledSystem(\n",
    "    \"./DeePMD-kit_Tutorial/00.data/training_data\", fmt=\"deepmd/npy\"\n",
    ")\n",
    "predict = training_systems.predict(\"./DeePMD-kit_Tutorial/01.train.finished/graph.pb\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "b4005a62-8bf2-4aaf-8865-20ea303ea0f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmYAAAGwCAYAAAADo6klAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB8QklEQVR4nO3de1hU1foH8O+AMAwoiCJ3FARNUQtEDdRSNIVKrczympnCyZKjJ7WTlYbaUTNNPdkvtTTS6lhqWlqKiJc6Gl4BFVEQBJXLCHgBBLnNrN8fHEbGmYEZBBng+3meeXL2Xnvvd480vK619rskQggBIiIiImp0Jo0dABERERFVYmJGREREZCSYmBEREREZCSZmREREREaCiRkRERGRkWBiRkRERGQkmJgRERERGYlWjR0AGUapVCIrKwtt2rSBRCJp7HCIiIhID0IIFBYWwtnZGSYmuvvFmJg1MVlZWXBzc2vsMIiIiKgOrl+/DldXV537mZg1MW3atAFQ+RdrbW3dyNEQERGRPgoKCuDm5qb6Pa4LE7Mmpmr40tramokZERFRE1PbNCRO/iciIiIyEkzMiIiIiIwEEzMiIiIiI8HEjIiIiMhIMDEjIiIiMhJMzIiIiIiMBBMzIiIiIiPBxIyIiIjISDAxIyIiIjISTMyIiIiIjAQTMyIiIiIjwcSMiIiIyEgwMSMiIiIyEkzMiIiIiACgsBAQolFDYGJGREREdPMmcPBgoydmrRr16kRERESNSQggMRG4fRt48cXGjoY9ZkRERNRCKZXAjz8Cjo7AwIGNHQ0A9pgRERFRS5SeDpw5A4wf39iRqGGPGREREbUsP/8MmJgAL7/c2JFoYI8ZERERtQw3bwIHDgCvvlqZmBkhJmZERETU/MXEAG3aGHVSBjAxIyIiouZMoQD27gWefBKwt2/saGrFxIyIiIiaJ7kcSE0FBgwA2rVr7Gj0wsSMiIiImhSFUuBk2i3kFJbAvo0F+nm0g6mJRL1RXFxlOYz+/QGJRPuJjBATMyIiImoyIhOysWhPIrLzS1TbnGwsED7SG8E9nSqHLi9cqEzK/PwaMdK6YWJGRERETUJkQjbe+j4WDy6aJM8vwVvfx2LjCHcMLbsB9O4NtG3bGCE+NON9LIGIiIjofxRKgUV7EjWSMgAQAKxL7uLw//0IxaDBTTYpA5iYERERURNwMu2W2vBlFYlQ4slr5+FYmIfvO/njZPrtRoiu/nAok4iIiIxS9Un+l2/c1dhvpijH2LNR+I9PMJQmpgCAnELN5K0pYWJGRERERkfbJP/qfDMvQQKB73s/r7bdvo3FowivwTAxIyIiIqOia5I/AJgoFXg54SB2ew9GaStz1XYJAEebytIZTRkTMyIiIjIaNU3yd82/AZf8HOzuPkgjKQOA8JHemvXMmhhO/iciIiKjoWuS/8C0OAhIcMKtJ0rNpGr7HG0ssG5S78o6Zk0ce8yIiIjIaDw4ed+8ohy95Jdxva0DMm3ur3UZFuiJLg5tdFf+b6KYmBEREZHRqD553+2OHHZFd5Bo3xn3zNUn9Q/w6oAAz/aPOrwGx8SMiIiIjEY/j3ZwsrGAeXoanAtyENPpCbX9zWWSvy6cY0ZERERGw7SsFKvcS9FKWYHjWpIyoHlM8teFiRkREREZh5IS4NdfEfBiIN6d9QIcbdSHL5vTJH9dOJRJREREje/yZeDKFWDsWABAcE8Zhnk7qir/N7dJ/ro0iR6z9PR0TJs2DR4eHpDJZPD09ER4eDjKysrU2s2aNQt+fn6QSqXw8fHReq5t27bBx8cHlpaW6NSpE1asWKFXDL///juefPJJyGQy2NnZYfTo0Wr7JRKJxmv9+vVqbc6fP49BgwZBJpPBxcUFixcvhhDaKrUQERG1IFu3Aq1bA0FBaptNTSQI8GyPF3xcEODZvtknZUAT6TG7dOkSlEolNmzYAC8vLyQkJCA0NBRFRUVYuXKlqp0QAlOnTsWJEydw7tw5jfPs27cPEydOxNq1azF8+HBcvHgRISEhkMlkCAsL03n9n3/+GaGhoVi6dCmGDBkCIQTOnz+v0S4iIgLBwcGq9zY2Nqo/FxQUYNiwYQgMDMSpU6eQnJyMKVOmwMrKCnPmzKnrR0NERNR0Xb8OHD8OjB/f2JEYD9FEffrpp8LDw0PrvvDwcPHEE09obB8/frwYM2aM2rbVq1cLV1dXoVQqtZ6rvLxcuLi4iI0bN9YYDwCxa9cunfu//PJLYWNjI0pKSlTbli1bJpydnXVeW5v8/HwBQOTn5+t9DBERkdH57TchUlMbO4pHRt/f301iKFOb/Px8tGtn2KOypaWlsLBQn0gok8mQkZGBq1evaj0mNjYWmZmZMDExga+vL5ycnPDss8/iwoULGm3DwsJgZ2eHvn37Yv369VAqlap9MTExGDRoEKTS+9WKg4KCkJWVhfT09BpjLigoUHsRERE1WUVFwI4dwJAhQOfOjR2N0WmSiVlqairWrl2L6dOnG3RcUFAQdu7ciYMHD0KpVCI5ORlr1qwBAGRnZ2s95sqVKwCAhQsXYv78+fjtt99ga2uLQYMG4datW6p2H3/8MbZv347o6GiMGzcOc+bMwdKlS1X75XI5HBwc1M5d9V4ul+uMedmyZbCxsVG93NzcDLpnIiKiR0GhFIhJvYlf4zMRk3oTCqWWOdQXLgAXLwKjRgEy2aMPsglo1DlmCxcuxKJFi2psc+rUKfTp00f1PisrC8HBwXjllVcQEhJi0PVCQ0ORmpqKESNGoLy8HNbW1pg1axYWLlwIU1NTrcdU9Xp9+OGHePnllwFUziVzdXXF9u3b8eabbwIA5s+frzqm6sGDxYsXq22XSNQnLYr/Tfx/cHt177//PmbPnq16X1BQwOSMiIiMSmRCNhbtSVRb49LJxgLhI70rS1sIARw5AnTsCPTo0XiBNgGNmpiFhYVh3LhxNbZxd3dX/TkrKwuBgYEICAjAV199ZfD1JBIJli9fjqVLl0Iul6NDhw44ePCgxnWqc3KqrJXi7e2t2iaVStG5c2dcu3ZN57X8/f1RUFCAGzduwMHBAY6Ojho9Yzk5OQCg0ZNWnVQqVRv+JCIiMiaRCdl46/tYPNg/Js8vwVvfx+Krl7pimDKvctiyU6dGibEpadTEzM7ODnZ2dnq1zczMRGBgIPz8/BAREQETk7qPwpqamsLFxQUAsHXrVgQEBMDe3l5r26ryG0lJSRg4cCAAoLy8HOnp6ehUww9YXFwcLCws0LZtWwBAQEAAPvjgA5SVlcHc3BwAEBUVBWdnZ51JIRERkTFTKAUW7UnUSMoAQADodDsbO765jCGfvw1TqfmjDq9JahJzzLKysjB48GC4ublh5cqVyM3NhVwu1+iBSklJQXx8PORyOe7du4f4+HjEx8er6p3l5eVh/fr1uHTpEuLj4zFr1ixs375dNc8MAE6ePIlu3bohMzMTAGBtbY3p06cjPDwcUVFRSEpKwltvvQUAeOWVVwAAe/bswddff42EhASkpqZi48aN+PDDD/G3v/1N1ds1YcIESKVSTJkyBQkJCdi1axeWLl2K2bNn1ziUSUREZKxOpt1SG75UEQJud+RwLsjBftsuOJlR+OiDa6KaRB2zqKgopKSkICUlBa6urmr7RLUCrSEhIfjjjz9U7319fQEAaWlpql6pzZs3Y+7cuRBCICAgAEeOHEG/fv1UxxQXFyMpKQnl5eWqbStWrECrVq3w2muv4d69e3jyySdx6NAh2NraAgDMzMzw5ZdfYvbs2VAqlejcuTMWL16MGTNmqM5hY2ODAwcOYMaMGejTpw9sbW0xe/ZstfljRERExk6hFKpq/Jdv3NXYL60og19GIq60c1UtQJ5TqCV5I60kQrD0fFNSUFAAGxsb5Ofnw9raurHDISKiFkTbJP/qZGUlGHHpv9je6xmg2mjQ1lB/BHi2f1RhGiV9f383iR4zIiIialy6JvlX6Xc9AfdaSbH98WGqbRJULjzez8OwuqMtGRMzIiIiqlFNk/xbKSow7ux+bPUJhsLkfumpqv6y8JHeLWKNy/rCxIyIiIhqpGuSv/eNK5CVl+AH32chJOrPEzpWr2NGemNiRkRERDXSmLwvBEZc+i/+6OyHQqmVanNYoCe6OLSBfZvK4Uv2lBmOiRkRERHVyL7N/XWm294rwGO5V3HU3UctKQOAAV4dWvwk/4fFxIyIiIhq1M+jHZxsLOBw8SyKzaQ46dZDbeiSk/zrT5MoMEtERESNxxQCn3lWoNy0FS53cNdIygBO8q8vTMyIiIhIt9xcICYG/QN74+9zXoGjjYXabkcbC6yb1JuT/OsJhzKJiIhIu/8lZRgxAjAxQXAHYJi3o6ryPyf51z8mZkRERKROoQAuXABKSoBRo9R2mZpIOMG/AXEok4iIiO5TKoEffwQ6dgSqrSVNjwZ7zIiIiKhSaiqQkABMnFhr0+qLmXNIs/7olZj5+vpCItHvw46NjX2ogIiIiKgRbNsG9O8PvPBCrU21LWbuxEr/9UKvxOzFF19s4DCIiIioUeTkAH/8AYwZA5jUPsNJ12Lm8vwSvPV9LJ/QfEgSIYSuheLJCBUUFMDGxgb5+fmwtrZu7HCIiKgp++MPwMEBeOwxQI+RMYVSYODyQ1rXzQTuF5o9+t4QDms+QN/f35z8T0RE1EwolAIxqTfxa3wmYlJvQqHU0fdSUQHs2QP07Al066ZXUgboXsy8igCQnV+Ck2m36hA9AXWY/K9QKLB69Wps27YN165dQ1lZmdr+W7f4l0FERPSo6T3vKyMDuHYNGDQIMHDkRWMx84dsR5oM7jFbtGgRVq1ahVdffRX5+fmYPXs2Ro8eDRMTEyxcuLABQiQiIqKaVM37erA3q2reV2RCduWGM2eAvDwgIMDgpAxQX8y8PtqRJoMTsx9++AFff/015s6di1atWmH8+PHYuHEjPvroIxw/frwhYiQiIiIdFEqBRXsSNSbjA1Bt+9cv56A4fQYwMwN8fPQeunxQ1WLmuo6WoLKXjouZ153BiZlcLkevXr0AAK1bt0Z+fj4AYMSIEfj999/rNzoiIiLSSaEU+PZYWo3zvtoV3YHbhTM4bdYeePxxvc+rba6aqYkE4SO9AUAjOeNi5vXD4Dlmrq6uyM7ORseOHeHl5YWoqCj07t0bp06dglQqbYgYiYiI6AHa5pQ9qH3RHfhlXkRUF3+ME2Z1Pm/1uWrBPZ2wblJvjTaOrGNWLwxOzF566SUcPHgQTz75JGbNmoXx48dj06ZNuHbtGt55552GiJGIiIiq0VVLrIpEKOF/7TxyWrdDVNcAAPrN+9K3RllwTycuZt5AHrqO2fHjx/HXX3/By8sLox5Y6JTqH+uYERG1bLXVEpNWlGHM+Wj8xycYQmKid20x1ihrWPr+/n7otTL9/f3h7+//sKchIiIiPdRUS8wvIxEVJqb4wfc5AIbN+zKkRlmAZ/u6hE560Csx2717N5599lmYmZlh9+7dNbZlrxkREVHD0VYjzFSpwJjz0fi551BUmN7/1d7OyhxLXuqp17wv1igzDnqvlSmXy2Fvb1/jupkSiQQKhaK+YiMiIqIHPDhXzP1WJuyK72BXjyFqSRkAzH++uyopUyhFjXPCWKPMOOiVmCmVSq1/JiIiokern0c7tLMyx62iMgxOPYVE+8447dpDa1tHGxkA/VYFqKpRJs8v0fpQQdUcM9Yoa1gG1zHbsmULSktLNbaXlZVhy5Yt9RIUERERaWdqIsHSIE/4ZSQixa4jctpon+9VVehV31UBWKPMOBicmL3xxhuqorLVFRYW4o033qiXoIiIiFoivRYhv3QJwZKbeHLMM8iwcdB6HgmgSrJqWxVg0Z5E1XWqapQ52qgPVzraWKhKZVDDMvipTCEEJFqWcsjIyICNjU29BEVERNTSRCZkY+HuC5AX3B+VcrSWYuGoHvcTosuXgRs3gEGD8M++QM/ODpj/awJuFZWrjqk+RBmTetPgJy1Zo6xx6Z2Y+fr6QiKRQCKRYOjQoWjV6v6hCoUCaWlpCA4ObpAgiYiImqOqCfnRiXJsOpausV9eUIrp38fi69HdMEyZC9jbA4MGqfY/97gzgno66Uyi6vqkpamJhCUxGoneiVnV05jx8fEICgpC69atVfvMzc3h7u6Ol19+ud4DJCIiao70WVIJACzKS3Bg5SYM2fwRTGWaT0TWlETxScumR+/ELDw8HADg7u6OsWPHwsKCf4lERER1UduSSgAAIeB5MwMOd29iW+cBeCHjLgZ0Mex3L5+0bHoMnvz/+uuvw8LCAmVlZcjIyMC1a9fUXkRERKSbQil0Tsiv7oXEI7htaY2/3H0AADFX8gy+Fp+0bHoMTswuX76Mp556CjKZDJ06dYKHhwc8PDzg7u4ODw+PhoiRiIio2aht6SPXO3IEJf2FX3sE4pbl/Yfqkm/c1f2kZg34pGXTYvBTmVOmTEGrVq3w22+/wcnJSesTmkRERKRdTRPyh10+jgsOnbH/sf4a+6ISbyAq8YZGYVh98EnLpsPgxCw+Ph5nzpxBt27dGiIeIiKiZk3bRPvWpcUYmB6HQ579UNbKrMbjqwrDGtrbxSctmwaDhzK9vb2Rl2f4OPfDSE9Px7Rp0+Dh4QGZTAZPT0+Eh4ejrKxMrd2sWbPg5+cHqVQKHx8frefatm0bfHx8YGlpiU6dOmHFihV6xfD777/jySefhEwmg52dHUaPHq3a9+2336pKiTz4ysnJUd2Dtv2RkZF1+1CIiKhJqpqQX9VX5X3jCjrekeNAF/9akzJAe2FYaj4M7jFbvnw5/vnPf2Lp0qXo1asXzMzUf4isra3rLbgqly5dglKpxIYNG+Dl5YWEhASEhoaiqKgIK1euVLUTQmDq1Kk4ceIEzp07p3Geffv2YeLEiVi7di2GDx+OixcvIiQkBDKZDGFhYTqv//PPPyM0NBRLly7FkCFDIITA+fPnVfvHjh2rUcNtypQpKCkpgb29vdr26Oho9Ohxf02zdu34JAwRUUtSNSH/re/OYMDVs7ja1hEZbR0NOoe2wrDUPEiEEAal2yYmlZ1sD84tq1oRQKFQ1F90NVixYgXWrVuHK1euaOxbuHAhfvnlF8THx6ttnzBhAsrLy7F9+3bVtjVr1uCzzz7DtWvXtM6Xq6iogLu7OxYtWoRp06bpFVtubi5cXFywadMmvPbaawAqe8w8PDwQFxenszdPHwUFBbCxsUF+fn6DJMFERPQI3LmD43v+wJLEEpwXrWtvr8O/x/ngBR+XegyMGoq+v78N7jE7fPjwQwVWX/Lz8w3ubSotLYWlpaXaNplMhoyMDFy9ehXu7u4ax8TGxiIzMxMmJibw9fWFXC6Hj48PVq5cqdbzVd2WLVtgaWmJMWPGaOwbNWoUSkpK0KVLF7zzzjta2zwYc/VF4wsKCvS4UyIiMlqXLwM5OfCfMAK/SExwMu0W5Pn38PHvF3GrqKz246thYdjmx+DEbFC1pSAaS2pqKtauXYvPPvvMoOOCgoLwzjvvYMqUKQgMDERKSgrWrFkDAMjOztaamFX1yC1cuBCrVq2Cu7s7PvvsMwwaNAjJyclak8NvvvkGEyZMgEwmU21r3bo1Vq1ahQEDBsDExAS7d+/G2LFjsXnzZkyaNElnzMuWLcOiRYsMuk8iIjJCQgDJyUBODvDUUwAAUwABnu0Rk3rToKSMhWGbL4Mn/wPAf//7X0yaNAn9+/dHZmYmAOC7777D0aNHDTrPwoULdU6ar3qdPn1a7ZisrCwEBwfjlVdeQUhIiEHXCw0NRVhYGEaMGAFzc3P4+/tj3LhxAABTU1OtxyiVSgDAhx9+iJdffhl+fn6IiIiARCJRGxKtEhMTg8TERI1hTzs7O7zzzjvo168f+vTpg8WLF+Ptt9/Gp59+WmPM77//PvLz81Wv69evG3TPRERkBIqLgehooG1bVVJWnb5rWgIsDNvcGZyY/fzzzwgKCoJMJkNsbKxqmK2wsBBLly416FxhYWG4ePFija+ePXuq2mdlZSEwMBABAQH46quvDA0dEokEy5cvx927d3H16lXI5XL069cPALT2lgGAk1Plo8je3t6qbVKpFJ07d9a60sHGjRvh4+MDPz+/WuPx9/fH5cuXa2wjlUphbW2t9iIioiakoAD4+WfgmWcABwetTQwZkmRh2ObN4KHMf/3rX1i/fj0mT56MH3/8UbW9f//+WLx4sUHnsrOzg52dnV5tMzMzERgYqOqxqnoIoS5MTU3h4lI5WXLr1q0ICAjQeHqySlX5jaSkJAwcOBAAUF5ejvT0dHTq1Emt7d27d7Ft2zYsW7ZMrzji4uJUiR8RETVDR45U9pL970EwXWpb0xIA2srM8H8Te8O/c3v2lDVjBidmSUlJePrppzW2W1tb486dO/URk4asrCwMHjwYHTt2xMqVK5Gbm6va5+h4/xHjlJQU3L17F3K5HPfu3VM9lent7Q1zc3Pk5eVhx44dGDx4MEpKShAREYHt27fjjz/+UJ3j5MmTmDx5Mg4ePAgXFxdYW1tj+vTpCA8Ph5ubm1rts1deeUUtzp9++gkVFRWYOHGixj1s3rwZZmZm8PX1hYmJCfbs2YPPP/8cy5cvr8+PioiIjEFpKfDNN8CbbwJ6dCSoSmh8HwsJoJacVaVgn7zcCwO89OvMoKbL4MTMyckJKSkpGkN/R48eRefOnesrLjVRUVFISUlBSkoKXF1d1fZVr/YREhKilmT5+voCANLS0lTxbt68GXPnzoUQAgEBAThy5IhqOBMAiouLkZSUhPLyctW2FStWoFWrVnjttddw7949PPnkkzh06BBsbW3VYtm0aRNGjx6tsb3Kv/71L1y9ehWmpqbo2rUrvvnmmxon/hMRURN06hSgUADTpwMGLFtYtabloj2JamtpOtZhCSZqugyuY/bpp59i8+bN+OabbzBs2DDs3bsXV69exTvvvIOPPvqoxkKt9PBYx4yIyEgplcDWrcCLLwJWVnU+jUIpuKZlM9Rgdcz++c9/Ij8/H4GBgSgpKcHTTz8NqVSKuXPnMikjIqKW6cYNICkJeP75h0rKAK5p2dIZ3GNWpbi4GImJiVAqlfD29kbr1nWvXEz6Y48ZEZGROXoUsLMDHnvMoKFLaln0/f1t8KONU6dORWFhISwtLdGnTx/069cPrVu3RlFREaZOnfpQQRMRETUZCgVw5gxgbQ1068akjOqFwT1mpqamyM7O1igvkZeXB0dHR1RUVNRrgKSOPWZEREYgKwtISwO8vQEdD3wRVVfvc8wKCgoghIAQAoWFhbCwuF8MT6FQYO/evTprgRERETUbN24AsbGV88nYS0b1TO/ErG3btqplkrp27aqxXyKRcE1HIiJqvioqgHPnKpOxESMaOxpqpvROzA4fPgwhBIYMGYKff/5ZbfFuc3NzdOrUCc7Ozg0SJBERUaNSKIAffwReeAFo06axo6FmTO/EbNCgQQAqi7W6ubk91JJIRERETUZyMnD5MsCC4PQIGFzHrFOnTrhz5w42bdqEixcvQiKRwNvbG1OnToWNjU1DxEhERNQ4/vMfIDCwcj4Z0SNgcLfX6dOn4enpidWrV+PWrVvIy8vDqlWr4OnpidjY2IaIkYiI6NHKygJ+/hkYPx5w4lJI9OgYXC7jqaeegpeXF77++mu0alXZ4VZRUYGQkBBcuXIFf/75Z4MESpVYLoOIqIFFRwPu7oCnJ5+6pHqj7+9vgxMzmUyGuLg4dOvWTW17YmIi+vTpg+Li4rpFTHphYkZE1EDKyoDISOCpp1ibjOpdg1X+t7a2xrVr1zS2X79+HW34pAoRETVFV65U1iYbOpRJGTUqgxOzsWPHYtq0afjpp59w/fp1ZGRk4Mcff0RISAjGjx/fEDESERE1nJMngcJCwN//oRcgJ3pYBj+VuXLlSkgkEkyePFm1/JKZmRneeustfPLJJ/UeIBERUYMoKQHOn7+/1iWRETB4jlmV4uJipKamQggBLy8vWFpa1ndspAXnmBER1QO5HLhwAQgIAPj7ix6Bel8r80GWlpaqZZqYlBERUZORmQnExXFZJTJKBs8xq6iowIIFC2BjYwN3d3d06tQJNjY2mD9/PsrLyxsiRiIiojpTKAViUm/i1zPXkLj5ZyiKipmUkdEyuMcsLCwMu3btwqeffoqAgAAAQExMDBYuXIi8vDysX7++3oMkIiKqi8iEbCzak4g7uXfwYuIRzHoiCE5Z1xA+sjWCe7JwLBkfg+eY2djY4Mcff8Szzz6rtn3fvn0YN24c8vPz6zVAUsc5ZkRE+olMyMZb38ei37XzKDazwHmnLgCAqpKx6yb1ZnJGj0yD1TGzsLCAu7u7xnZ3d3eYm5sbejoiIqJ6p1AKLNl1FmPjI3HK1VuVlAFAVW/Eoj2JUCjr9PwbUYMxODGbMWMGPv74Y5SWlqq2lZaWYsmSJQgLC6vX4IiIiOrifFQMOiQl4OdeQ6E0MdXYLwBk55fgZNqtRx8cUQ0MnmMWFxeHgwcPwtXVFU888QQA4OzZsygrK8PQoUMxevRoVdudO3fWX6RERES1EQLYvRvZbdwR69q91ub7ErIBAP082sHUhOtiUuMzODFr27YtXn75ZbVtbm5u9RYQERFRndy9C8THA717o22ZJYCMWg/ZEnMVW2KuwsnGAuEjvTnnjBpdnQvMUuPg5H8iIi3On69chLxXL8DcHAqlwMDlhyDPL4E+v+T4QAA1tAab/E9ERGQ0hAAuXQLy8wE/P+B/D6GZmkgQPtIbwP2kq8bT/O+/fCCAGludK/8TERE1FIVS4GTaLeQUlsDOSgpIgLy7pbBvY3F/PlhBAZCQALi5aV3rMrinE9ZN6o1FexKRnV9S6zWrPxAQ4Nm+Ae6KqHZMzIiIyKhUFYXVlUw52Vhg8VB3DEs/A4weDbTS/assuKcThnk74mTaLexLyMaWmKu1Xj+nsPYkjqihcCiTiIiMRlVRWJ09XELAOuUSNq3Zjkjvp2pMyqqYmkgQ4Nkez+o5d8y+jYUhIRPVKyZmRERkFBRKgUV7EnVP1hcCoy8cgrx1e5zo2Mvg+WD9PNrBycZC55wzCSp74/p5tDMwcqL6U6fE7ODBgxgxYgQ8PT3h5eWFESNGIDo6ur5jIyKiFuRk2i2dPWWdbmdhWMoJ7Ow5FPmyNnUqEFvTAwFV78NHerOeGTUqgxOzL774AsHBwWjTpg1mzZqFmTNnwtraGs899xy++OKLhoiRiIhaAF1zu569dBQlrcxxoIu/3sfoUvVAgKON+nClo40FS2WQUTB48v+yZcuwevVqteWXZs6ciQEDBnBZJiIiqrMH53bZ3CuE/7XziO7yJMpNzfQ6Rh/VHwjIKSxRf9KTqJEZ3GNWUFCA4OBgje3Dhw9HQUFBvQRFREQtT/U5YE9kJcHx7k0c0JGUPex8sKoHAl7wcUGAZ3smZWQ0DE7MRo0ahV27dmls//XXXzFy5Mh6CYqIiFoeUxMJwp/vhoFpcbhpZYukDu5aFyDnfDBqzgweyuzevTuWLFmCI0eOICAgAABw/PhxHDt2DHPmzMHnn3+uajtz5sz6i5SIiJq3vDwEF6bD/O0X8OFfOYCOBwEcua4lNWMGr5Xp4eGh34klEly5cqVOQZFuXCuTiJqK6tX7a53HdekScPMmEBAAmJjoV/mfqAlpsLUy09LS9HrVZ1KWnp6OadOmwcPDAzKZDJ6enggPD0dZWZlau1mzZsHPzw9SqRQ+Pj5az7Vt2zb4+PjA0tISnTp1wooVK2q89pEjRyCRSLS+Tp06pWp37do1jBw5ElZWVrCzs8PMmTM14jt//jwGDRoEmUwGFxcXLF68GFxDnoiao8iEbAxcfgjjvz6OWT/GY/zXxzFw+SFEJmSrN1QqgQsXKte6HDAAMKn8tVR9DtiALnYY4GXH+WDUItR5SaaysjKkpaXB09MTrfSovPwwLl26BKVSiQ0bNsDLywsJCQkIDQ1FUVERVq5cqWonhMDUqVNx4sQJnDt3TuM8+/btw8SJE7F27VoMHz4cFy9eREhICGQymc6nSfv374/sbPUvkgULFiA6Ohp9+vQBACgUCjz//PPo0KEDjh49ips3b+L111+HEAJr164FUJkpDxs2DIGBgTh16hSSk5MxZcoUWFlZYc6cOfX1URERNbqq6v0P/rNTnl+Ct76PvV+W4u5d4NgxoE8foD3XpiQC6jCUWVxcjL///e/YvHkzACA5ORmdO3fGzJkz4ezsjHnz5jVIoA9asWIF1q1bp7VnbuHChfjll18QHx+vtn3ChAkoLy/H9u3bVdvWrFmDzz77DNeuXYNEUvu/wsrLy+Hq6oqwsDAsWLAAQGXCN2LECFy/fh3Ozs4AgB9//BFTpkxBTk4OrK2tsW7dOrz//vu4ceMGpFIpAOCTTz7B2rVrkZGRode1AQ5lEpFxUygFBi4/pLNQrASVc8SOhvrA9EAUMG4coOf3H1FT1mBDme+//z7Onj2LI0eOwMLifv2YZ555Bj/99FPdoq2D/Px8tGtn2GPSpaWlajEDgEwmQ0ZGBq5erX1hWwDYvXs38vLyMGXKFNW2mJgY9OzZU5WUAUBQUBBKS0tx5swZVZtBgwapkrKqNllZWUhPT68x5oKCArUXEZGxOn7lpu51LlE5stH57HEknEwExo9nUkb0AIMTs19++QVffPEFBg4cqNbL4+3tjdTU1HoNTpfU1FSsXbsW06dPN+i4oKAg7Ny5EwcPHoRSqURycjLWrFkDABrDlbps2rQJQUFBcHNzU22Ty+VwcHBQa2drawtzc3PI5XKdbareV7XRZtmyZbCxsVG9ql+XiMiYRCZkY8YPsTr3W5SXYFL8Phzr9ATSnTvrdU6FUiAm9SZ+jc9ETOpNg9bGJGqKDE7McnNzYW9vr7G9qKhI7+G4KgsXLtQ5sb7qdfr0abVjsrKyEBwcjFdeeQUhISEGXS80NBRhYWEYMWIEzM3N4e/vj3HjxgEATE01a+U8KCMjA/v378e0adM09mm7dyGE2vYH21SNItf0ub3//vvIz89Xva5fv15rnEREj1rVvLI798q17u+deRFd867he59nAYlEr4r9ej9AQNSMGJyY9e3bF7///rvqfVVS8fXXX6vqmukrLCwMFy9erPHVs2dPVfusrCwEBgYiICAAX331laGhQyKRYPny5bh79y6uXr0KuVyOfv36AQDc3d1rPT4iIgLt27fHqFGj1LY7Ojpq9Hrdvn0b5eXlql4xbW1ycnIAQKMnrTqpVApra2u1FxGRMVEoBRbtSdSY7A8AJkoFRiccxAX7zjjn1BUSiUSviv1Vid6Dw6JVDxAwOaPmqk5rZQYHByMxMREVFRX497//jQsXLiAmJgZ//PGHQeeys7ODnZ2dXm0zMzMRGBgIPz8/REREwMTE4JxSxdTUFC4uLgCArVu3IiAgQGsvYHVCCERERGDy5MkwM1NfHiQgIABLlixBdnY2nJwqCx5GRUVBKpXCz89P1eaDDz5AWVkZzM3NVW2cnZ31SgqJiIyBttpkJ9NuaZ1X5lCYB7f8G4jqEoBSs/vza2ur2F9ToidQ+QDBoj2JGObtyNIZ1OwYnN30798fx44dQ3FxMTw9PREVFQUHBwfExMSokpD6lpWVhcGDB8PNzQ0rV65Ebm4u5HK5Rg9USkoK4uPjIZfLce/ePcTHxyM+Pl5VTywvLw/r16/HpUuXEB8fj1mzZmH79u2qeWYAcPLkSXTr1g2ZmZlq5z506BDS0tK0DmMOHz4c3t7eeO211xAXF4eDBw9i7ty5CA0NVfVwTZgwAVKpFFOmTEFCQgJ27dqFpUuXYvbs2QYPARMRNQZdQ4vRiZrzZP2vnYNFRRlOu3jjrtQSANDW0ux+qYwa6Er0qggA2fklOJl266Huh8gY1akAWa9evVTlMh6FqKgopKSkICUlBa6urmr7qlf7CAkJUeu18/X1BVBZFLeqV2rz5s2YO3cuhBAICAjAkSNHVMOZQGU5kKSkJJSXq8+T2LRpE/r374/u3btrxGdqaorff/8db7/9NgYMGACZTIYJEyao1VizsbHBgQMHMGPGDPTp0we2traYPXs2Zs+eXfcPhojoEampNtmmY+mq960UFfDOuYKbMhtctXVWa/t/43tjQJfaR0lyCnUnZXVpR9SUGFzHDKh8KjIiIgJXrlzBmjVrYG9vj8jISLi5uaFHjx4NESf9D+uYEdGjVlttMgAwkQBO+TlwKLiJpA6dUPS/XjKgWu2y94boNfQYk3oT478+Xmu7raH+CPBkYVpqGhqsjtkff/yBXr164cSJE/j5559x9+5dAMC5c+cQHh5e94iJiMioVJWqWH0gucakDADsCm6iS+5VxLl000jKgNrnlVXXz6MdnGwsoKu1BNDrAQKipsjgxGzevHn417/+hQMHDqgmsQNAYGAgYmJi6jU4IiJ69BRKgX9HJ8Pv4wMY//VxfHE4RWdbM0U5emVfRtuSQnSe/Aoc28rU9ttYmuEfz3TFMG9Hva9vaiJB+EhvANBIzuqS6BE1JQYnZufPn8dLL72ksb1Dhw64efNmvQRFRESNIzIhG37/OoDV0Zd11iSrYqpUYMTF/+KynRuSO7hjmLcjjr43BO880wVtZZVPr98pLsfq6GSD648F93TCukm94WijXu/M0cZCrwcIiJoqgyf/t23bFtnZ2fDw8FDbHhcXpypBQURETYtCKfDFoRSsjk7Wq71n3nW4FORgV88hakOLBxLlWBN9ufYFzPUQ3NMJw7wdNcpzsKeMmjODE7MJEybgvffew/bt2yGRSKBUKnHs2DHMnTsXkydPbogYiYioAUUmZGPh7guQF5Tq1f6lhEP406M3Uu3c1IYWAdR7/TFTEwkn+FOLYvBQ5pIlS9CxY0e4uLjg7t278Pb2xtNPP43+/ftj/vz5DREjERE1kL3nsjD9+1i9kjLnghwMT47Brh6BuGnVFkDlHLKqXjDWHyN6eAb3mJmZmeGHH37A4sWLERcXB6VSCV9fX3Tp0qUh4iMiogay91w2wrbG6dV2cOpppNi5Iaqr+tJ7MjNT1cR+1h8jenh1KjALAJ6envD09KzPWIiI6BGJTMjG2/+JrbWdtLwUT6XH40THniiUWmnsr+oBC/Bsr9fC5AD0bkfUEumVmBlSnX7VqlV1DoaIiBqeQimwcPeFWtt1vpmBNqVF+K+HL0pbmetsV9UDVlV/TJ5fonWeWVWhWdYfI9JNr8QsLk69q/vMmTNQKBR47LHHAADJyckwNTVtsLUyiYio/nxxKKXWOWW+mZdQZG6Bs86P1Xq+qh6wqvpjb30fCwmglpyx/hiRfvRKzA4fPqz686pVq9CmTRts3rwZtra2AIDbt2/jjTfewFNPPdUwURIRUb2ITMiusSSGRXkJuuek45altcZalw/S1gNWVX9s0Z5EtQcBHG0sED7Sm/XHiGph8FqZLi4uiIqK0lgTMyEhAcOHD0dWVla9BkjquFYmEdVVbWteOhTmwfNmBk679kBZK7Maz1XV56WrLplCKVh/jKgafX9/Gzz5v6CgADdu3NBIzHJyclBYWGh4pERE1GCqJ0h5haXakzIh4FKQC8+b1/FnZ/2mpNTWA8b6Y0R1Y3Bi9tJLL+GNN97AZ599Bn9/fwDA8ePH8e6772L06NH1HiAREdVNZEK2xpDig0yVCgxMj0dKezedSZkEwLdT+qJVKxPk3S1lDxhRAzI4MVu/fj3mzp2LSZMmoby8ch21Vq1aYdq0aVixYkW9B0hERIaLTMjGW9/Han06sopVaTGeSzqK7b2GARLdSdbfnvbAoG729R8kEWkweI5ZlaKiIqSmpkIIAS8vL1hZada3ofrHOWZEVBOFUuD4lZsI2XwK98qVOtsFXD2LAovWuOCgux6liQQIfcoD7z/n3RChErUoDTbHrIqVlRUef/zxuh5ORET1rHLNy0TIC3QPXUoryvBSwiH89MRwCEnNq/J1aC2Fb0fb+g6TiGpg8FqZRERkfCITsv+35qXupKx7zhV0z0nD9seH1ZqUAUBOYSne+j4WkQnZ9RkqEdWAiRkRUROmUAocu5yH2dvO6m4kBIKS/kJWmw6Id34MChNTAMCC57tj9VgftLPSXhqjap7Loj2JUCjrNOuFiAxU56FMIiJqXPo8ddmmtAiP5aYj1qUb8mVtVNvbWpphygAPnEy7hVtF5TqPF1BfD5OIGpbBiVlRUREn+hMRNTJ9nrrscSMVSokEcc7dVL1kVd7o7wFTE4lqncva6NuOiB6OwUOZDg4OmDp1Ko4ePdoQ8RARUS2qFiHXmZQJgS65VyGtKMNF+84aSZmV1BRhQ7wA3F/nsjb6tiOih2NwYrZ161bk5+dj6NCh6Nq1Kz755BMuw0RE1EAUSoGY1Jv4NT4TMak3oVCKGhcht7lXCL/Mi7gjs0asS3etbVa8/LiqOGw/j3ZwsrGAripmEgBOD6yHSUQNp851zG7evIktW7bg22+/RWJiIoKCgjB16lSMGjUKrVpx6lpDYR0zopZD2xyytpZmuFOsfU6YVWkxBqXFIrJrAJQP9JJVefNpzbpkVcOiANR64WpbD5OI9Kfv7+86J2bVrV27Fu+++y7KyspgZ2eH6dOnY968ebC0tHzYU9MDmJgRtQxV5S/0IRFKdMtNh6ysFLGu2nvJWktb4dOXH8dzj2tPsLQlgU61rIdJRPpr8AKzcrkcW7ZsQUREBK5du4YxY8Zg2rRpyMrKwieffILjx48jKiqqrqcnImqxFEqBeTvP69dYCLyccAj7uwagUKr9way+7raY0K8jbK3MoVAKrWtcBvd0wjBvR9WC51wPk6hxGJyY7dy5ExEREdi/fz+8vb0xY8YMTJo0CW3btlW18fHxga+vb33GSUTU7CiUQmsi9MWhFJ3DldV1vpmBTneysaPXMzW2O5V+G6fSbwOouRfM1ETCkhhEjczgxOyNN97AuHHjcOzYMfTt21drm86dO+PDDz986OCIiJorXUOHC57vjohjabUeP+LinzjesRcOe2r/HtZFnl+Ct76P5bwxIiNl8Byz4uJizh1rRJxjRtT06apBJgFqrEsGAO2K89E34wIOevZDhWndZqNIADjaWODoe0M4VEn0iDTYHDNLS0soFArs2rULFy9ehEQiQbdu3fDiiy/yaUwioloolAKL9iRqTcBqS8r8MhJxx6INorr467XWpS6s5k9kvAzOpBISEjBq1CjcuHEDjz32GAAgOTkZHTp0wO7du9GrV696D5KIqLk4mXarxiWUtDFRKjDg6llcbt8Rcmu7eouF1fyJjI/B/+QKCQlBz549kZGRgdjYWMTGxuL69et4/PHH8be//a0hYiQiajYMTYY63L0F36wknHXqWq9JGcBq/kTGyOAes7Nnz+L06dOwtbVVbbO1tcWSJUt0PgxARESV7KykerftknsVbcqKccalOyAxbC5YW5kZ8u+Vax0erZpjxmr+RMbH4B6zxx57DDdu3NDYnpOTAy8vr3oJioioOYpMyMac7WdrbWeqVKB7zhWYK8orl1UyMCkDgDcGuAOAxlJLVe/DR3pz4j+REdKrx6ygoED156VLl2LmzJlYuHAh/P39AQDHjx/H4sWLsXz58oaJkoioidP1JOaDWpcWwy/zImJduuksGFuTqt6wsCFd8JhjG42SHI6s5k9k1PQql2FiYgJJtX+xVR1Sta36e4VC0RBx0v+wXAZR06NQCgxcfqjWSf/ti+6g3/UE7Os2sE7X0ba2pa4itkT0aNVruYzDhw/XW2BERC1NrU9iCoGn0uOQ1aZDnZMyQHtvGKv5EzUteiVmgwYNaug4apSeno6PP/4Yhw4dglwuh7OzMyZNmoQPP/wQ5ubmqnazZs3C0aNHkZCQgO7duyM+Pl7jXNu2bcPSpUtVJT7CwsLw7rvv6rz2kSNHEBgYqHXfyZMn0bdvX5w9exaffPIJjh49iry8PLi7u2P69OmYNWuW2j14eHhonGPfvn0IDg424NMgImOlq3eqpicxLcvu4cXEI/jPE8EGzyWTAGhnZY75z3eHo42MvWFEzUCTqAh76dIlKJVKbNiwAV5eXkhISEBoaCiKioqwcuVKVTshBKZOnYoTJ07g3LlzGufZt28fJk6ciLVr12L48OG4ePEiQkJCIJPJEBYWpvXa/fv3R3Z2ttq2BQsWIDo6Gn369AEAnDlzBh06dMD3338PNzc3/PXXX/jb3/4GU1NTjfNGR0ejR48eqvft2vGpKKLmQNcSS+EjvXWWpeh7PQHFZhZ1SsqqLHmpJ+eLETUjBi/JZCxWrFiBdevW4cqVKxr7Fi5ciF9++UWjx2zChAkoLy/H9u3bVdvWrFmDzz77DNeuXVObR6dLeXk5XF1dERYWhgULFuhsN2PGDFy8eBGHDh0CcL/HLC4uDj4+PvrdpBacY0ZkfGpaYgkA/m+CLz7+/aIqaWulqMALiX9gt/fTKDc1q9M1a1qMnIiMT4MtyWQs8vPzDe5tKi0t1VjnUyaTISMjA1evXoW7u3ut59i9ezfy8vIwZcqUOsU3atQolJSUoEuXLnjnnXcwZsyYWmMuLS1Vva/+hCwRNb7alliSAPj494tY8Lw33v5PLFzvyGF/9zb2PjbAoKTsrcGdYWclRbvWUjhacxI/UXNV98XWGlFqairWrl2L6dOnG3RcUFAQdu7ciYMHD0KpVCI5ORlr1qwBAI3hSl02bdqEoKAguLm56WwTExODbdu24c0331Rta926NVatWoUdO3Zg7969GDp0KMaOHYvvv/++xustW7YMNjY2qldN1yWiR0uhFPj2WFqNE/ur1qVMzC7A+60yAIkEsa7dcc/csKr7Az07YNpTnfGSrwsCPNszKSNqpho1MVu4cCEkEkmNr9OnT6sdk5WVheDgYLzyyisICQkx6HqhoaEICwvDiBEjYG5uDn9/f4wbNw4AYGpqWuvxGRkZ2L9/P6ZNm6azzYULF/DCCy/go48+wrBhw1Tb7ezs8M4776Bfv37o06cPFi9ejLfffhuffvppjdd8//33kZ+fr3pdv35dz7slooYUmZCNgcsP4ePfL9ba1ryiHEd/+B0/3QAybRzqdL28otLaGxFRk6fXUKavr69e868AIDY2Vu+Lh4WFqRIjXaoPL2ZlZSEwMBABAQH46quv9L5OFYlEguXLl2Pp0qWQy+Xo0KEDDh48qHEdXSIiItC+fXuMGjVK6/7ExEQMGTIEoaGhmD9/fq3n8/f3x8aNG2tsI5VKIZXqv4QLETU8fYvFAkDH29lod68Alzp0QolZ3dem5LqWRC2DXonZiy++qPpzSUkJvvzyS3h7eyMgIABAZeX/Cxcu4O233zbo4nZ2drCz029R3szMTAQGBsLPzw8REREwMal7Z5+pqSlcXFwAAFu3bkVAQADs7e1rPEYIgYiICEyePBlmZprzQi5cuIAhQ4bg9ddfx5IlS/SKIy4uDk5OnLhL1JTUNKfsQU4FuXC/nYU/O/vV+Xpc15KoZdErMQsPD1f9OSQkBDNnzsTHH3+s0aahhtmysrIwePBgdOzYEStXrkRubq5qn6Ojo+rPKSkpuHv3LuRyOe7du6d6KtPb2xvm5ubIy8vDjh07MHjwYJSUlCAiIgLbt2/HH3/8oTrHyZMnMXnyZBw8eFCVvAHAoUOHkJaWpnUY88KFCwgMDMTw4cMxe/ZsyOVyAJUJYIcOHQAAmzdvhpmZGXx9fWFiYoI9e/bg888/5zJWRE1MrcViAUjLS9EtNx0FFq0fOikDuK4lUUti8FOZ27dv15j3BQCTJk1Cnz598M0339RLYNVFRUUhJSUFKSkpcHV1VdtXvdpHSEiIWpLl6+sLAEhLS1MNVW7evBlz586FEAIBAQE4cuQI+vXrpzqmuLgYSUlJKC8vV7vOpk2b0L9/f3Tv3l0jvu3btyM3Nxc//PADfvjhB9X2Tp06IT09XfX+X//6F65evQpTU1N07doV33zzDSZNmmT4B0JEj1RV4Vh5/j38kZxbY9tWigo8l3QMe7sNRGkr8xrb1obrWhK1PAbXMXN0dMSyZcvwxhtvqG2PiIjAvHnzcOPGjXoNkNSxjhnRo6WtcKwuXXKvwr7oNo65+9T5egue7w67NlKua0nUzDRYHbN//OMfeOutt3DmzBn4+/sDqJxj9s033+Cjjz6qe8REREbGkEn+Y85HI9qrHy536FSna1XNJZsywIPJGFELZnBiNm/ePHTu3Bn//ve/8Z///AcA0L17d3z77bd49dVX6z1AIqLGoFAKzPv5fK1JmdsdObrmXcWOnkPrvKwS55IRUZUmuyRTS8WhTKKG8eAC5Mv3JSI+o+aVNp65fAIJDp6QW+v3dDkA2FqaQQC4U3x/HiuXVyJq/hp0SaY7d+5gx44duHLlCubOnYt27dohNjYWDg4Oak8yEhE1BYbMIwMAy7J7CLh2DjEde6FIallr+3ZWZlgwoodqKSUAakkg55IRURWDE7Nz587hmWeegY2NDdLT0xESEoJ27dph165duHr1KrZs2dIQcRIRNQhD5pEBQNfcdJgrKvCnR2+917q8VVQOR2sLBHi2V22r/mcioioGV2mdPXs2pkyZgsuXL8PC4n4l6meffRZ//vlnvQZHRNSQDCkWCyHQO+MilBITJDh6GbQAOQDkFOrXG0dELZvBPWanTp3Chg0bNLa7uLioCqsSETUF+hSLBQCr0mI8lncVcuv2yLKueZUQXbikEhHpw+DEzMLCAgUFmhNik5KSVFXuiYiaAnlB7UmZU0EuPG5l4qRbT1SYGj4tl0sqEZEhDB7KfOGFF7B48WJVZXyJRIJr165h3rx5ePnll+s9QCKi+qZQCvw7+jLm7zqvu5EQ6HQ7C+63s/GXu0+dkzKAZTCISH8Gl8soKCjAc889hwsXLqCwsBDOzs6Qy+UICAjA3r17YWVl1VCxElgug+hhRSZkY97O82rlKh7USlGBgelxuGjvgRtt9C+F8SCWwSCiKg1WLsPa2hpHjx7FoUOHEBsbC6VSid69e+OZZ555qICJiBpaZEI2pn8fW2Mb65K7eCblBHb2HGrw+UOfcseQbo4sg0FEdWZwj9mWLVswduxYSKVSte1lZWX48ccfMXny5HoNkNSxx4yobhRKgYHLD9U42X9gWhzyrNrikr2Hwef/x9Au+Mewrg8TIhE1Y/r+/jZ4jtkbb7yB/Px8je2FhYUaC5sTERmLmp7AtCgvwbj4SBx196lTUuZoLcXfh3Z52BCJiAwfyhRCQKJlPbiMjAzY2NjUS1BERPVNVx2xnvIUSITAtseHqa11Oay7PZzaylBcWoGoRDkKShQax1a1XjiqB4csiahe6J2Y+fr6QiKRQCKRYOjQoWjV6v6hCoUCaWlpCA4ObpAgiYge1oN1xCRCiWeT/sJ/PXxRKNV8aOm5Xk54qbcrgMph0C8OpSDiWBru3Lv/0IAjJ/cTUT3TOzF78cUXAQDx8fEICgpC69atVfvMzc3h7u7OchlEZLT6ebSDk40FsvNL0PZeAbxuXsfxjr20JmUA4GgjU/3Z1ESCWc90QdgQL65xSUQNSu/ELDw8HADg7u6OcePGaUz+JyIyZqYmEoSP9Mb6T7ei2EyKMy7dISTap9k66SgIa2oi4RqXRNSgDJ787+3tjfj4eI3tJ06cwOnTp+sjJiKi+qdUIliZi38+1x05nbroTMokYEFYImo8BidmM2bMwPXr1zW2Z2ZmYsaMGfUSFBGRPsoqlNj03yv46NcEbPrvFZRVKLU3zMkBYmIAZ2f0H/cszswfhnee6YK2MvWFyJ1sLLBuUm/OGSOiRmNwHbPWrVvj3Llz6Ny5s9r2tLQ0PP744ygsLKzXAEkd65gRVVq2NxFf/zcNymrfYBIJEDLQAx8+731/4507QHQ0MHo0YKL+b1GFUnDOGBE9Eg1W+V8qleLGjRsaiVl2drbak5pERA1l2d5EbPgzTWO7EMDX/01D+s0ifD2xN3D2LKBQAGPGaD0P54wRkbExeChz2LBheP/999WKzN65cwcffPABhg0bVq/BERE9qKxCia/+q5mUVXfgwg388o8lONGqPRR+fR5RZERED8/gLq7PPvsMTz/9NDp16gRfX18AlSU0HBwc8N1339V7gETUcj041OjXyRaL91xATRMwvPKuwTU/B//w7AP8JwFONimsNUZETYbBc8wAoKioCD/88APOnj0LmUyGxx9/HOPHj4eZmVntB9ND4RwzaikiE7KxaE+i2jJKJhKozSl70IsXDuNPj964ZXl/FZKqGWOc1E9EjUnf3991Ssyo8TAxo5YgMiEbb30fC32/nDrcvYUnsi/jsGcfKExMNfZLUFml/+h7Qzi5n4gaRb1O/t+9ezeeffZZmJmZYffu3TW2HTVqlGGREhFVo1AKLNqTqHdS5n/tHOSt2yPaq5/aWpfVCQDZ+SU4mXaLk/2JyKjplZi9+OKLkMvlsLe3Vy3NpI1EIoFCobnQLxGRvk6m3VIbvtSllaIC/a+exaUO7shpo1+ypWshcyIiY6FXYqZUKrX+mYiovlRN9N+XkF1rW6eCXDgV5CHWpTvuSi31vsaDC5kTERkbFh4jokYXmZCNhbsTIS+ovUfrsdx0yMpLEevSTefQ5YOq5phpW/+SiMiY6JWYff7553qfcObMmXUOhohajqoesgOJcnxzLL3W9maKcjyWexXlpq0Q7/yY3tepSt24/iURNQV6PZXp4eGh9j43NxfFxcVo27YtgMoCs5aWlrC3t8eVK1caJFCqxKcyqTnYey4LH/6SgNvF5Xq1ty65i96Zl3DSrQeKzWU1tm0rM8Ode/fP62RjwTpmRNTo6vWpzLS0+1W2//Of/+DLL7/Epk2b8Nhjlf9qTUpKQmhoKN58882HDJuImjtdyynpYl94E0/IL+NAF3+92v/fxN4wkUi4/iURNUkG1zHz9PTEjh07VFX/q5w5cwZjxoxRS+Ko/rHHjJqyveey8fZ/YvVrLAQGXzmDdFsnpLdzqbU5a5URkTFrsEXMs7OzUV6uOfygUChw48YNQ09HRC2EQikw/9cEvdq2KS3Cs5eOYdvjw/Sa4M95ZETUXBi8iPnQoUMRGhqK06dPo6qz7fTp03jzzTfxzDPP1HuARNQ8nEy7hVtFZbW2C7h6Dm53bmDbE8P1furS0caCSy4RUbNgcI/ZN998g9dffx39+vVTrY1ZUVGBoKAgbNy4sd4DJKLmobbiruYV5Rh18Q/s6hGodVmlB1lbtMIrfq54xtuR88iIqNkwODHr0KED9u7di+TkZFy6dAlCCHTv3h1du3ZtiPiIqAmqKoVRfQJ+TcVdPW5lou29Quzp9pReSVk7KzMcf/8ZmLcyuNOfiMio1flbzd3dHY899hief/75Bk/K0tPTMW3aNHh4eEAmk8HT0xPh4eEoK1MfFpk1axb8/PwglUrh4+Oj9Vzbtm2Dj48PLC0t0alTJ6xYsaLGax85cgQSiUTr69SpU6p22vavX79e7Vznz5/HoEGDIJPJ4OLigsWLF4NryFNzE5mQjYHLD2H818cx68d4jP/6OAYuP4SbhSXQ1qk16MoZ3GslRZxLN5SaSWs8t+R/r6Uv9WJSRkTNksE9ZsXFxfj73/+OzZs3AwCSk5PRuXNnzJw5E87Ozpg3b169B3np0iUolUps2LABXl5eSEhIQGhoKIqKirBy5UpVOyEEpk6dihMnTuDcuXMa59m3bx8mTpyItWvXYvjw4bh48SJCQkIgk8kQFham9dr9+/dHdrb6EjELFixAdHQ0+vTpo7Y9IiICwcHBqvc2NjaqPxcUFGDYsGEIDAzEqVOnkJycjClTpsDKygpz5syp0+dCZGwiE7Ix/XvNpy7l+SUI+zFebZtFeQm8c9KQZusMubWdXud3ZE0yImrmDE7M3n//fZw9exZHjhxRS0KeeeYZhIeHN0hiFhwcrHatzp07IykpCevWrVNLzKpWKMjNzdWamH333Xd48cUXMX36dNV53nvvPSxfvhwzZsyARMtEY3Nzczg6Oqrel5eXY/fu3QgLC9No37ZtW7W21f3www8oKSnBt99+C6lUip49eyI5ORmrVq3C7NmztV6bqClRKAXm7Tyvdd+D/cKeN6+jdWkxLjh4orSVuc5zmkiAvw/pgs4drFiTjIhaBIPHAn755Rd88cUXGDhwoFoy4e3tjdTU1HoNrib5+flo186wde9KS0thYaE+z0UmkyEjIwNXr17V6xy7d+9GXl4epkyZorEvLCwMdnZ26Nu3L9avX6+24HtMTAwGDRoEqfT+UE1QUBCysrKQnp5eY8wFBQVqLyJjolAKHEvJw/ivjuOOHpX8Xe/I4Vh4E2edH6sxKQOAL8b3xjvDuuIFHxcEeLZnUkZEzZ7BiVlubi7s7e01thcVFT2yXp/U1FSsXbtW1fOlr6CgIOzcuRMHDx6EUqlEcnIy1qxZAwAaw5W6bNq0CUFBQXBzc1Pb/vHHH2P79u2Ijo7GuHHjMGfOHCxdulS1Xy6Xw8HBQe2YqvdyuVzn9ZYtWwYbGxvV68HrEjWmyIRs+P3rACZuPIGT6bdqbCsrK0HvzIuQADjm7lNjWycbC6yf1BvPPc4hSyJqWQxOzPr27Yvff/9d9b4qGfv6668REBBg0LkWLlyoc2J91ev06dNqx2RlZSE4OBivvPIKQkJCDLpeaGgowsLCMGLECJibm8Pf3x/jxo0DAJia1v4kWEZGBvbv349p06Zp7Js/fz4CAgLg4+ODOXPmYPHixRoPFjyYuFZN/K8poX3//feRn5+vel2/fr3WOIkehar5ZPr0kpkpyvFs8jGcd/TC9bbah/sBYGi3Dtga6o+j7w3hPDIiapEMnmO2bNkyBAcHIzExERUVFfj3v/+NCxcuICYmBn/88YdB5woLC1MlRrq4u7ur/pyVlYXAwEAEBATgq6++MjR0SCQSLF++HEuXLoVcLkeHDh1w8OBBjevoEhERgfbt22PUqFG1tvX390dBQQFu3LgBBwcHODo6avSM5eTkAIBGT1p1UqlUbfiTyBgolALzftY+n0yNEOiemwabkrvY2XNorc0vZBVwHhkRtWgGJ2b9+/fHX3/9hRUrVsDT0xNRUVHo3bs3YmJi0KtXL4POZWdnBzs7/Z7GyszMRGBgIPz8/BAREQETk7o/Km9qagoXl8q197Zu3YqAgACtw7PVCSEQERGByZMnqwrr1iQuLg4WFhZo27YtACAgIAAffPABysrKYG5eOa8mKioKzs7OeiWFRMZk7cFk3LlXe0/Zq+cOIPKx/rho31mv88oLSnEy7RYCPNs/bIhERE2SQYlZeXk5/va3v2HBggWqchmPQlZWFgYPHoyOHTti5cqVyM3NVe2r/hRkSkoK7t69C7lcjnv37iE+Ph5A5YMJ5ubmyMvLw44dOzB48GCUlJQgIiIC27dvV+vpO3nyJCZPnoyDBw+qkjcAOHToENLS0rQOY+7ZswdyuRwBAQGQyWQ4fPgwPvzwQ/ztb39T9XZNmDABixYtwpQpU/DBBx/g8uXLWLp0KT766CM+kUlNSmRCNtYcTKmxjcetTLjfztJ7rcvqalshgIioOTMoMTMzM8OuXbuwYMGChopHq6ioKKSkpCAlJQWurq5q+6oXaA0JCVFLsnx9fQEAaWlpql6pzZs3Y+7cuRBCICAgAEeOHEG/fv1UxxQXFyMpKUljofZNmzahf//+6N69u0Z8ZmZm+PLLLzF79mwolUp07twZixcvxowZM1RtbGxscODAAcyYMQN9+vSBra0tZs+ejdmzZ9f9gyF6xBRKgUV7EmtsE5T0F2JduuGwZ986XaOmFQKIiJo7iTCw9Pwbb7yBXr16MaFoJAUFBbCxsUF+fj6sra0bOxxqYWJSb2L818e17mtTWoS+1y8gpuPjuGdet+TK0VqKY/OGco4ZETU7+v7+NniOmZeXFz7++GP89ddf8PPzg5WVldr+mTNnGh4tETUJuoYZe8hToDQxwR+d/fRa61KXhaN6MCkjohbN4B4zDw8P3SeTSHDlypWHDop0Y48ZNSaNHjMh0DfjAm5Z2iC1fd1r7LW1NMMno3uxRAYRNVsN1mOWlpb2UIERUdOhUAqcTLuFnMIS2LexQN7dUtU+65K76JJ3Dem2zshtbdgqHAAw3NsBXR1aI6CzHfxZ1Z+ICEAdErPq9CmQSkRNw4NJ2O2iMnz8eyKy8+8PX1blTq75N9DxdjaOd+wF5QNDl5ZmJiguV6I2bwzwYFkMIqIH1Ckx27RpE1avXo3Lly8DALp06YJ//OMfBlfiJyLjEJmQjUV71JMwbZRKAc9bGbC9V4C/dCyrtOG1Pvjnz+cgzy/RWLwcACQAHG0qFyQnIiJ1BldpXbBgAWbNmoWRI0di+/bt2L59O0aOHIl33nkH8+fPb4gYiagBRSZk463vY2tNyswU5RiaehL5Fq1x2rWHzna3issQPtIbQGUSVl3V+/CR3hy6JCLSwuDJ/3Z2dli7di3Gjx+vtn3r1q34+9//jry8vHoNkNRx8j/VJ4VSYODyQ7UmZbbF+XgqPQ67vQfXes6tof4I8GyvtRfOycYC4SO9OcmfiFqcBpv8r1Ao0KdPH43tfn5+qKioMPR0RNSIjl+5WWtSNujKGWS1sas1KXtwiDK4pxOGeTuqzVvjOphERDUzODGbNGkS1q1bh1WrVqlt/+qrrzBx4sR6C4yIGkbVJP/oRDl+PHVdZzvLsnsYefFP/PT48FqXVdI1RGlqIuEEfyIiA9R58n9UVBT8/f0BAMePH8f169cxefJktRUBHkzeiKhx6TvJ3zfzEspMW+lc69JEAiirTYJw5BAlEVG9MDgxS0hIQO/evQEAqampAIAOHTqgQ4cOSEhIULVjCQ0i46FQCnxx6DJWR1+usZ2JUoERl44i2qsfis1lOtt9Md4XtlZSDlESEdUzgxOzw4cPN0QcRNRAIhOysXB3IuQFNfeSdbh7G53uZOEPj946kzITCfDF+N547nH2jBERNYSHKjBLRMatqhRGbY9e9864iAILK5x28a5xPtkX432ZlBERNSAmZkTNlEIpsGhPYo1JmYlSgW65V1FqZo4Uu44627HMBRHRo8HEjKiZOpl2q8ZJ/vaFN+GWfwOX7TqiwKK1arsEgIO1FJ+96oO8u6WcQ0ZE9AgxMSNqpmqaU9b2XgF8s5Owv0uA1qHLhaN6YICXXUOGR0REWhicmBUVFcHKyqohYiGiOqq+ALmdlRSn0m/h6/9e0WhnqlSgx41UVJi0wv6u/TX2c8iSiKhxGZyYOTg44NVXX8XUqVMxcODAhoiJiAygb20yCIGXzx/Ebu+nUWJmobbLvJUJIl7vC3/P9hyyJCJqRAYvYr5161bk5+dj6NCh6Nq1Kz755BNkZWU1RGxEVAt9FyB/LDcdA9Pjse2J4RpJGQDMGOyFAV3smJQRETUygxOzkSNH4ueff0ZWVhbeeustbN26FZ06dcKIESOwc+dOrpdJ9Ijo89QlALx8/iDkrdvjqIev1v1tLc0QNsSr/gMkIiKDGZyYVWnfvj3eeecdnD17FqtWrUJ0dDTGjBkDZ2dnfPTRRyguLq7POInoAbU9delUkIshKSexq8dg5Mva6Gz3yehe7CkjIjISdX4qUy6XY8uWLYiIiMC1a9cwZswYTJs2DVlZWfjkk09w/PhxREVF1WesRC1a9Qn+9m0sEJmQrbPtwLQ4pNs64ZBnX50FY9tZmWHpS7040Z+IyIgYnJjt3LkTERER2L9/P7y9vTFjxgxMmjQJbdu2VbXx8fGBr6/2YRMiMpy+yyqZV5TD/9o5JDp0Rp6VbY1tF4zowaSMiMjIGJyYvfHGGxg3bhyOHTuGvn37am3TuXNnfPjhhw8dHBFVJmXTv4+ttV3H29loX5yPU649cM9cc4L/gxyta29DRESPlsGJWXZ2NiwtLWtsI5PJEB4eXuegiKiSQikwb+f5Wtt1z7kCM0UF4ly61dpWAsDRprKaPxERGReDE7OKigoUFBRobJdIJJBKpTA3N6+XwIhaOoVS4JujabhTXK6zjbSiDN1y0nBXaomL9p1rPWfVbLPwkd6c8E9EZIQMTszatm0LiY7JxADg6uqKKVOmIDw8HCYmdX7ok6hF06dorM29QvhmXUJMx8dRaibV2G9pbgppKxPcrpbYObKyPxGRUTM4Mfv222/x4YcfYsqUKejXrx+EEDh16hQ2b96M+fPnIzc3FytXroRUKsUHH3zQEDETNWtVRWNrqk/mXJCDx3Kv4rCn9nmeAPDm054IG+Kl9iQnFyMnIjJuBidmmzdvxmeffYZXX31VtW3UqFHo1asXNmzYgIMHD6Jjx45YsmQJEzMiAymUAgt3X9CdlAmBIamnkGzXscakDADc7SxhaiJBgGf7eo+TiIgahsFjjTExMVpLYfj6+iImJgYAMHDgQFy7du3hoyNqYb44lAJ5QanWfTb3CvHK+Wgc8uqHjLaOtZ7Lvg2fuiQiamoMTsxcXV2xadMmje2bNm2Cm5sbAODmzZuwta25hhIRqYtMyMbq6GSt+wakx8Px7k1sf3xYreeRAHDiU5dERE2SwUOZK1euxCuvvIJ9+/ahb9++kEgkOHXqFC5duoQdO3YAAE6dOoWxY8fWe7BEzUlVJX95QQnyCkvxxaHLGm2k5aUYdfFP/NxzCJQmprWek09dEhE1bRIhRG1rIGu4evUq1q9fj6SkJAgh0K1bN7z55ptwd3dvgBCpuoKCAtjY2CA/Px/W1taNHQ7V0d5z2Zj/awJuFZXpbNMl9yosy0uQ6NAZ5aZmWttIALX5aE586pKIyCjp+/vboB6z8vJyDB8+HBs2bMCyZcseOkiilmjZ3kRs+DNNd4P/TfA/79gFlzt00tqkqi/s/yb0hq2VOZ+6JCJqJgxKzMzMzJCQkFBjHTMi0k6hFPj8YHKNSZlVaTEey72KpA7uyG2te54m65ERETVPBs8xmzx5MjZt2oRPPvmkIeIhapb0WYS8a246zBUVOOfUBRWmmv9rtrMyw4IRPeBozZ4xIqLmyuDErKysDBs3bsSBAwfQp08fWFlZqe1ftWpVvQVH1BzUWjBWCLjfzkK7ewU43vFxrU0kAJa+1Is9ZEREzZzB5TISEhLQu3dvWFtbIzk5GXFxcapXfHx8A4QIpKenY9q0afDw8IBMJoOnpyfCw8NRVqY+cXrWrFnw8/ODVCqFj4+P1nNt27YNPj4+sLS0RKdOnbBixYoar33kyBFIJBKtr1OnTgGoXA1BV5ucnBzVPWjbHxkZ+fAfEBmtqkXIdSVlrUuL0TvzEkpaSXUmZW0tzbBuUm8mZURELYDBPWaHDx9uiDhqdOnSJSiVSmzYsAFeXl5ISEhAaGgoioqKsHLlSlU7IQSmTp2KEydO4Ny5cxrn2bdvHyZOnIi1a9di+PDhuHjxIkJCQiCTyRAWFqb12v3790d2drbatgULFiA6Ohp9+vQBAIwdOxbBwcFqbaZMmYKSkhLY29urbY+OjkaPHj1U79u1Y62p5kahFDh+5SZiUm/iZNpNnYuQS8tL8UzKCezp/jQUNZTC+L/xvTGgi11DhUtEREbE4MSsSkpKClJTU/H0009DJpNBCNFgDwUEBwerJT6dO3dGUlIS1q1bp5aYff755wCA3NxcrYnZd999hxdffBHTp09Xnee9997D8uXLMWPGDK3xm5ubw9HxfpX18vJy7N69G2FhYar2MpkMMplM1SY3NxeHDh3SWoi3ffv2auej5kOhFPjiUAo2/JmK4jKF7oZCoEfOFViUl+KXHoE1ntPJxgL+XFKJiKjFMHgo8+bNmxg6dCi6du2K5557TtWbFBISgjlz5tR7gLrk5+cb3NtUWloKCwv1ZWpkMhkyMjJw9epVvc6xe/du5OXlYcqUKTrbbNmyBZaWlhgzZozGvlGjRsHe3h4DBgxQFeStLeaCggK1FxmfyIRs+P3rAFZHJ9ealI07ux/pbZ1wxtW7xnNKwEKxREQtjcGJ2TvvvAMzMzNcu3YNlpaWqu1jx459ZPOlUlNTsXbtWlXPl76CgoKwc+dOHDx4EEqlEsnJyVizZg0AaAxX6rJp0yYEBQWplp/S5ptvvsGECRPUetFat26NVatWYceOHdi7dy+GDh2KsWPH4vvvv6/xesuWLYONjY3qVdN1qXHsPZeN6d/H6hyyrOKVdw2D0mLxo08wiqSWNbZ1srHgvDIiohbI4KHMqKgo7N+/H66urmrbu3TponevU5WFCxdi0aJFNbY5deqUai4XAGRlZSE4OBivvPIKQkJCDLpeaGgoUlNTMWLECJSXl8Pa2hqzZs3CwoULYWpa+3I3GRkZ2L9/P7Zt26azTUxMDBITE7Flyxa17XZ2dnjnnXdU7/v06YPbt2/j008/xaRJk3Se7/3338fs2bNV7wsKCpicGZG957IQtjWu1nYjLv6Jvzo9gRS7jlr3O1pL8dmrPsi7W8pCsURELZjBiVlRUZFaT1mVvLw8SKVSg84VFhaGcePG1dim+jJPWVlZCAwMREBAAL766iuDrgUAEokEy5cvx9KlSyGXy9GhQwccPHhQ4zq6REREoH379hg1apTONhs3boSPjw/8/PxqPZ+/vz82btxYYxupVGrw50qPRmRCNt7+T81Jmc29QvTOuoRor34oMbPQ2W7hqB4Y4MUJ/kRELZ3BidnTTz+NLVu24OOPPwZQmewolUqsWLECgYE1T2R+kJ2dHezs9PtllJmZicDAQPj5+SEiIgImJgaPwqqYmprCxcUFALB161YEBARoPD35ICEEIiIiMHnyZJiZaV+38O7du9i2bZvey1XFxcXByYlDVU2RQimwaE9ijW18spJQbCbFkc5+EBLtP69tLc3wyWjWJyMiokoGJ2YrVqzA4MGDcfr0aZSVleGf//wnLly4gFu3buHYsWMNESOysrIwePBgdOzYEStXrkRubq5qX/UnHFNSUnD37l3I5XLcu3dPVVfN29sb5ubmyMvLw44dOzB48GCUlJQgIiIC27dvxx9//KE6x8mTJzF58mQcPHhQlbwBwKFDh5CWloZp06bpjPOnn35CRUUFJk6cqLFv8+bNMDMzg6+vL0xMTLBnzx58/vnnWL58+cN8NNRITqbdQna+9ir+EqFE34xE5FjZIr2di9Y2bS3N8EZ/D4QN8eKQJRERqRicmHl7e+PcuXNYt24dTE1NUVRUhNGjR2PGjBkN1vsTFRWFlJQUpKSkaMxtE+J+6c6QkBC1JMvX1xcAkJaWphqq3Lx5M+bOnQshBAICAnDkyBH069dPdUxxcTGSkpJQXq4+kXvTpk3o378/unfvrjPOTZs2YfTo0bC11b7G4b/+9S9cvXoVpqam6Nq1K7755psa55eR8cop1J6UtSvOh8etTKS0d8MtSxuN/dMGuOMZb0fOISMiIq0konpmQ0avoKAANjY2yM/Ph7W1dWOH0+wplAIn024hp7BEbVJ+TOpNjP/6uFpbtztyuObn4HjHnhpDlxyyJCJq2fT9/V2nArN37tzByZMnkZOTA6VSqbZv8uTJdTklkdHZey4b839NwK2i+0t/OdlYIHykN4Z5O8LJxgLy/BJIlAp43bwOWXkpYjqpL6sU3MMBr/m7w9+zPXvIiIioVgb3mO3ZswcTJ05EUVER2rRpo1YtXyKR4NatW/UeJN3HHrOGp1AKzNoah9/Oa69tJwGwblJvAMCsb4/j6bQ4nHLtjjsy9b+PLyf44rnHnRs6XCIiagL0/f1t8KONc+bMwdSpU1FYWIg7d+7g9u3bqheTMmrqIhOy0TM8UmdSBgACwKI9iRjWXoKfHHOQ0GeQWlLmZGOB9ZN6MykjIiKDGTyUmZmZiZkzZ2qtZUbUlEUmVFbw10e32P/iXB8r+M59E0d1zEMjIiIylMGJWVBQEE6fPo3OnTs3RDxEjUKhFJi383yt7dqUFiE46Ri2Pz4cL3Zwgy8AUxMJArjQOBER1QODE7Pnn38e7777LhITE9GrVy+NYqs1VcUnMlbHr9ysda3LPhkXUGQuw/ZewwAA9m10V/InIiKqC4MTs9DQUADA4sWLNfZJJBIoFIqHj4roEYtJvalzn6lSgecv/RdRXfxVyyq1tzJHP492jyo8IiJqIQxOzB4sj0HUPGh/ONmxIA/OBbk47NlXba3Lj1/oyXlkRERU7+q+4CRRMxLQWXPN1n7XEyCrKEWsSzcUSq1U20Of8sBzj7NQLBER1T+9E7PnnnsO+fn5qvdLlizBnTt3VO9v3rwJb2/veg2O6FHx92yPtpaV8yVbKSrQU56CfIvWSGvnAlSr1TdtoDs+fJ4/50RE1DD0Tsz279+P0tJS1fvly5er1S2rqKhAUlJS/UZH9IiYmkjwyehecCrIxePZl5Fm64ykDu5qbUKfcseCET0aJ0AiImoR9J5j9uACAVxik5qbYHtTdPCWYEb+EygqvL8Mk61lKyx5sRcLxhIRUYOr01qZRM1KWRkQFwe0bg2/sNdxjAVjiYiokeidmEkkErV1Mau2ERkrhT4JllIJfPcdMHEiYFH51CULxhIRUWMxaChzypQpkEqlAICSkhJMnz4dVlaVT6tVn39G1NgiE7KxaE8isvNLVNucbCwQPtIbwT3/90Tl2bPAzZvAtGmNFCUREZE6idBzstgbb7yh1wkjIiIeKiCqmb6r07dkkQnZeOv7WI3KZFV9Zesm+iL45D5gzBjAxuZRh0dERC2Qvr+/9U7MyDgwMauZQikwcPkhtZ6y6jrekcOvNAcrv/4nTFuZPuLoiIiopdL39zcLzFKzcjLtls6kbHDqKZSZtMIuh8dx8uqdRxsYERGRHvhUJjUrOYWaSZm0vBT9Mi7gnFNX3LK00dmOiIiosTExo2bFvo2F2nvPm9dhVXYPJ916orSVuc52RERExoBDmdSs9PNoBycbC0gA9JCnwKK8FOecuqqSMgkqn87s59GuUeMkIiLShokZNSumJhIsHuoOn8xLKLRojQuOXqp9VU9lho/0ZsFYIiIySkzMqHnJy8OwvCRMnz0G5Z3c1XY52lhg3aTe9+uYERERGRnOMaPmQQggLQ1ITQWeew5BAJ55oiOXViIioiaFiRk1fUol8NtvQO/ewLBhqs1cWomIiJoaJmbUtOXmAvv2AZMnN3YkRERED41zzKjpioysTMyYlBERUTPBHjMyKgqlqH1eWFERsH17ZUJmwn9bEBFR88HEjIxGZEI2Fu1JVFtSycnGAuEjve8/SRkfDygUwKRJTMqIiKjZ4W82MgqRCdl46/tYjXUu5fkleOv7WESezwJ+/RVwcQH8/IBW/DcFERE1P0zMqNEplAKL9iRCaNknALQpuYtd/7cdCr8+QIcOjzo8IiKiR4bdDtToTqbd0ugpq+J94wokEDjQwQMnSy0Q8IhjIyIiepTYY0aNLqdQS1ImBDxvXoesvAQXHDyhNDHV3o6IiKgZYY8ZNTr7NhZq761L7qJr3lWk2zojtb2bznZERETNDXvMqNH182gHJxsLSADIykow+MppxDp3Q56VLYDKxcedbCpLZxARETVnTMyo0ZmaSBD+fDf0yr6MbnlXsdt7MJQmpgAqkzIACB/pzXUuiYio2WNiRo1PCATH/IawsJGQd39CbZejjQXWTep9v44ZERFRM9YkErP09HRMmzYNHh4ekMlk8PT0RHh4OMrKytTazZo1C35+fpBKpfDx8dF6rm3btsHHxweWlpbo1KkTVqxYUev1k5OT8cILL8DOzg7W1tYYMGAADh8+rNbm2rVrGDlyJKysrGBnZ4eZM2dqxHf+/HkMGjQIMpkMLi4uWLx4MYTQViSiBTl/HoiOBt58E8P7euLoe0OwNdQf/x7ng62h/jj63hAmZURE1GI0icn/ly5dglKpxIYNG+Dl5YWEhASEhoaiqKgIK1euVLUTQmDq1Kk4ceIEzp07p3Geffv2YeLEiVi7di2GDx+OixcvIiQkBDKZDGFhYTqv//zzz6Nr1644dOgQZDIZ1qxZgxEjRiA1NRWOjo5QKBR4/vnn0aFDBxw9ehQ3b97E66+/DiEE1q5dCwAoKCjAsGHDEBgYiFOnTiE5ORlTpkyBlZUV5syZU/8fWiPTa2mlH34AnnsO6NVLtcnURIIAz/aPOFoiIiIjIZqoTz/9VHh4eGjdFx4eLp544gmN7ePHjxdjxoxR27Z69Wrh6uoqlEql1nPl5uYKAOLPP/9UbSsoKBAARHR0tBBCiL179woTExORmZmparN161YhlUpFfn6+EEKIL7/8UtjY2IiSkhJVm2XLlglnZ2ed19YmPz9fAFCd1xjtO58l/JdGi07v/aZ6+S+NFvvOZ1U2kMuF2LtXiHv3GjdQIiKiR0Tf399NYihTm/z8fLRrZ9hTeqWlpbCwUC+5IJPJkJGRgatXr2o9pn379ujevTu2bNmCoqIiVFRUYMOGDXBwcICfnx8AICYmBj179oSzs7PquKCgIJSWluLMmTOqNoMGDYJUKlVrk5WVhfT09BpjLigoUHsZs9qWVjq+5Rfg9m0gOBiwYPkLIiKi6ppkYpaamoq1a9di+vTpBh0XFBSEnTt34uDBg1AqlUhOTsaaNWsAANnZ2VqPkUgkOHDgAOLi4tCmTRtYWFhg9erViIyMRNu2bQEAcrkcDg4OasfZ2trC3NwccrlcZ5uq91VttFm2bBlsbGxULzc3N51tG1tNSytJlAo8ee08VpwvhKLrY4CET1gSERE9qFETs4ULF0IikdT4On36tNoxWVlZCA4OxiuvvIKQkBCDrhcaGoqwsDCMGDEC5ubm8Pf3x7hx4wAApqamWo8RQuDtt9+Gvb09/vvf/+LkyZN44YUXMGLECLVkTqIl0RBCqG1/sI3438R/bcdWef/995Gfn696Xb9+Xf8bfsR0La3U4e4t+GYlIdHeA2dM2+Fk2q1GiI6IiMj4Nerk/7CwMFVipIu7u7vqz1lZWQgMDERAQAC++uorg68nkUiwfPlyLF26FHK5HB06dMDBgwc1rlPdoUOH8Ntvv+H27duwtrYGAHz55Zc4cOAANm/ejHnz5sHR0REnTpxQO+727dsoLy9X9Yo5Ojpq9Izl5OQAgEZPWnVSqVRt+NOYaVsyqdPtLDgW3sQJt56qXjIurURERKRdoyZmdnZ2sLOz06ttZmYmAgMD4efnh4iICJiY1L2zz9TUFC4uLgCArVu3IiAgAPb29lrbFhcXA4DG9UxMTKBUKgEAAQEBWLJkCbKzs+HkVFnaISoqClKpVDUPLSAgAB988AHKyspgbm6uauPs7KwzKWxqqi+ZZKpU4LHcq5BA4ETHXjrbERER0X1NYo5ZVlYWBg8eDDc3N6xcuRK5ubmQy+UaPVApKSmIj4+HXC7HvXv3EB8fj/j4eFU9sby8PKxfvx6XLl1CfHw8Zs2ahe3bt6vmmQHAyZMn0a1bN2RmZgKoTKhsbW3x+uuv4+zZs0hOTsa7776LtLQ0PP/88wCA4cOHw9vbG6+99hri4uJw8OBBzJ07F6GhoapetgkTJkAqlWLKlClISEjArl27sHTpUsyePbvGocympGppJYvyUgxJPYXrbR1wwcFTtZ9LKxEREdWsSdQxi4qKQkpKClJSUuDq6qq2T1Qr0BoSEoI//vhD9d7X1xcAkJaWpuqV2rx5M+bOnQshBAICAnDkyBH069dPdUxxcTGSkpJQXl4OoLJXLzIyEh9++CGGDBmC8vJy9OjRA7/++iueeKKySr2pqSl+//13vP322xgwYABkMhkmTJigVmPNxsYGBw4cwIwZM9CnTx/Y2tpi9uzZmD17dv1+WI3I1ESCpf1s8dMXh7D/sf5qDwFwaSUiIqLaSYRo6aXnm5aCggLY2NggPz9f1RtnNHbvBry9EVlihUV7EtUeBHCysUD4SG9W8SciohZJ39/fTaLHjIzcrVuVSdmUKQCAYADDvB1rr/xPREREapiY0cM5fBjo0AF4/XW1zVxaiYiIyHBMzKhuysqA7duBl19mBX8iIqJ6wsSMDHflCpCTA7z4IpMyIiKietQkymWQETl8GBAC8PcHrKwaOxoiIqJmhT1mpJ+SEuD8ecDJCfD0rL09ERERGYyJGdXuyhXgxg3AxweQyRo7GiIiomaLQ5lUs8xM4NIlICCASRkREVEDY2JG2pWUADExQFER8NxzjR0NERFRi8DEjDRVVAA//AD4+QFduzZ2NERERC0G55iRujNngLt3gWnTGjsSIiKiFoeJGVUSAvj6a2DCBKB168aOhoiIqEViYkaVJBIgJAQw4eg2ERFRY+FvYbqPSRkREVGj4m9iIiIiIiPBxIyIiIjISDAxIyIiIjISTMyIiIiIjAQTMyIiIiIjwcSMiIiIyEgwMSMiIiIyEkzMiIiIiIwEEzMiIiIiI8HEjIiIiMhIMDEjIiIiMhJMzIiIiIiMBBMzIiIiIiPBxIyIiIjISLRq7ADIMEIIAEBBQUEjR0JERET6qvq9XfV7XBcmZk1MYWEhAMDNza2RIyEiIiJDFRYWwsbGRud+iagtdSOjolQqkZWVhTZt2kAikTR2OAYrKCiAm5sbrl+/Dmtr68YO55Fr6fcP8DPg/bfs+wf4GbTU+xdCoLCwEM7OzjAx0T2TjD1mTYyJiQlcXV0bO4yHZm1t3aL+h3xQS79/gJ8B779l3z/Az6Al3n9NPWVVOPmfiIiIyEgwMSMiIiIyEkzM6JGSSqUIDw+HVCpt7FAaRUu/f4CfAe+/Zd8/wM+gpd9/bTj5n4iIiMhIsMeMiIiIyEgwMSMiIiIyEkzMiIiIiIwEEzMiIiIiI8HEjLRKT0/HtGnT4OHhAZlMBk9PT4SHh6OsrEyt3axZs+Dn5wepVAofHx+t59q2bRt8fHxgaWmJTp06YcWKFbVePzk5GS+88ALs7OxgbW2NAQMG4PDhw2ptrl27hpEjR8LKygp2dnaYOXOmRnznz5/HoEGDIJPJ4OLigsWLF9e6Tllj3/+RI0cgkUi0vk6dOgUA+Pbbb3W2ycnJUd2Dtv2RkZFN/v4BaN2/fv16tXPV9e+/KXwGZ8+exfjx4+Hm5gaZTIbu3bvj3//+t8Y9NOefgYb8Dmjsz6DK77//jieffBIymQx2dnYYPXq0al9z/h7Q5/6Bhv8eaBSCSIt9+/aJKVOmiP3794vU1FTx66+/Cnt7ezFnzhy1dn//+9/FF198IV577TXxxBNPaJxn7969olWrVmLdunUiNTVV/Pbbb8LR0VGsXbu2xut7eXmJ5557Tpw9e1YkJyeLt99+W1haWors7GwhhBAVFRWiZ8+eIjAwUMTGxooDBw4IZ2dnERYWpjpHfn6+cHBwEOPGjRPnz58XP//8s2jTpo1YuXKlUd9/aWmpyM7OVnuFhIQId3d3oVQqhRBCFBcXa7QJCgoSgwYNUp0nLS1NABDR0dFq7UpLS5v8/QshBAARERGh1q64uFi1/2H+/pvCZ7Bp0ybx97//XRw5ckSkpqaK7777TshkMrXzNuefgYb+Dmjsz0AIIXbs2CFsbW3FunXrRFJSkrh06ZLYvn27an9z/h7Q5/6FaPjvgcbAxIz09umnnwoPDw+t+8LDw7X+Dzl+/HgxZswYtW2rV68Wrq6uar9kq8vNzRUAxJ9//qnaVlBQoPpyEaLyf3QTExORmZmparN161YhlUpFfn6+EEKIL7/8UtjY2IiSkhJVm2XLlglnZ2ed167Jo7r/B5WVlQl7e3uxePFinW1ycnKEmZmZ2LJli2pb1RdyXFycXtepjbHdPwCxa9cuncfV99+/EMb3GTzo7bffFoGBgar3zflnoDG+A4R4dJ9BeXm5cHFxERs3btQ7tub0PaDv/TfG90BD41Am6S0/Px/t2rUz6JjS0lJYWFiobZPJZMjIyMDVq1e1HtO+fXt0794dW7ZsQVFRESoqKrBhwwY4ODjAz88PABATE4OePXvC2dlZdVxQUBBKS0tx5swZVZtBgwapFTEMCgpCVlYW0tPTDboP4NHd/4N2796NvLw8TJkyRWebLVu2wNLSEmPGjNHYN2rUKNjb22PAgAHYsWOHQfFXZ4z3HxYWBjs7O/Tt2xfr16+HUqlU7avvv3/AOD8DfeJrjj8DjfEdADy6zyA2NhaZmZkwMTGBr68vnJyc8Oyzz+LChQs6r9OcvgcMuf9H/T3Q0JiYkV5SU1Oxdu1aTJ8+3aDjgoKCsHPnThw8eBBKpRLJyclYs2YNACA7O1vrMRKJBAcOHEBcXBzatGkDCwsLrF69GpGRkWjbti0AQC6Xw8HBQe04W1tbmJubQy6X62xT9b6qjb4e5f0/aNOmTQgKCoKbm5vONt988w0mTJgAmUym2ta6dWusWrUKO3bswN69ezF06FCMHTsW33//vUH3ABjn/X/88cfYvn07oqOjMW7cOMyZMwdLly5V7a/Pv3/AOD+D6mJiYrBt2za8+eabqm3N+WfgUX8HAI/2M7hy5QoAYOHChZg/fz5+++032NraYtCgQbh165bWY5rT94C+9/+ovwceicbusqNHKzw8XACo8XXq1Cm1YzIzM4WXl5eYNm1ajefV1oWtVCrFP//5T2FhYSFMTU2Fra2tWLhwoQAgTpw4ofVcSqVSjBo1Sjz77LPi6NGj4syZM+Ktt94SLi4uIisrSwghRGhoqBg+fLjGsWZmZmLr1q1CCCGGDRsm/va3v6ntf+edd4z+/qu7fv26MDExETt27NDZ5q+//hIAxOnTp2s9X9++fZvd/VdZuXKlsLa2Vr3X9vefkZFR6/03xc8gISFBdOjQQXz88ce1nq+5/AzU9TugqfwM/PDDDwKA2LBhg2pbSUmJsLOzE+vXr9do39y+Bwy9/yqGfA/ExMToPE9javUwSR01PWFhYRg3blyNbdzd3VV/zsrKQmBgIAICAvDVV18ZfD2JRILly5dj6dKlkMvl6NChAw4ePKhxneoOHTqE3377Dbdv34a1tTUA4Msvv8SBAwewefNmzJs3D46Ojjhx4oTacbdv30Z5ebnqX0OOjo4a/yIaMWIEVq9ejQMHDsDV1dUo77+6iIgItG/fHqNGjdLZZuPGjfDx8VEN89Zk6tSpOHv2LM6ePauzTVO7/yr+/v4oKCjAjRs34ODgoPXvv+pJtZr+/h+Mzdg/g8TERAwZMgShoaGYP39+redrLj8Ddf0OaCo/A05OTgAAb29v1TapVIrOnTvj2rVrGu2b2/eAofdfxZDvgQd70owFE7MWxs7ODnZ2dnq1zczMRGBgIPz8/BAREQETk7qPfJuamsLFxQUAsHXrVgQEBMDe3l5r2+LiYgDQuJ6JiYlq7kBAQACWLFmC7Oxs1f/AUVFRkEqlqi+mgIAAfPDBBygrK4O5uTkA4NSpU3B2dsbQoUMhkUhqjLmx7r+KEAIRERGYPHkyzMzMtLa5e/cutm3bhmXLlukVR0pKClxcXNCtW7da2zaF+68uLi4OFhYWquFubX//UVFRev/9A8b/GVy4cAFDhgzB66+/jiVLlugVR3P5Gajrd0BT+RmoKj+RlJSEgQMHAgDKy8uRnp6OTp06qbVtjt8Dhtx/dYZ8D+jzD4NG0bgddmSsqrqthwwZIjIyMtQeRa7u8uXLIi4uTrz55puia9euIi4uTsTFxakexc7NzRXr1q0TFy9eFHFxcWLmzJnCwsJCrfv6xIkT4rHHHhMZGRmqY9q3by9Gjx4t4uPjRVJSkpg7d64wMzMT8fHxQoj7j8oPHTpUxMbGiujoaOHq6qr2qPydO3eEg4ODGD9+vDh//rzYuXOnsLa21usx6ca8/yrR0dECgEhMTNQZ58aNG4WFhYW4deuWxr5vv/1W/PDDDyIxMVFcunRJrFixQpiZmYlVq1Y1+fvfvXu3+Oqrr8T58+dFSkqK+Prrr4W1tbWYOXOmqs3D/P03hc+gavhy4sSJarHl5OSo2jTnn4GG/g4whs9g1qxZwsXFRezfv19cunRJTJs2Tdjb22v8/95cvwdqu/9H8T3QGJiYkVYRERE65x5UN2jQIK1t0tLShBCV/0P6+/sLKysrYWlpKYYOHSqOHz+udo7Dhw+rHSOEEKdOnRLDhw8X7dq1E23atBH+/v5i7969asddvXpVPP/880Imk4l27dqJsLAwtUeihRDi3Llz4qmnnhJSqVQ4OjqKhQsX6vWIdGPfvxCVj5j379+/xjgDAgLEhAkTtO779ttvRffu3YWlpaVo06aN8PPzE999912t994U7n/fvn3Cx8dHtG7dWlhaWoqePXuKNWvWiPLycrV2df37bwqfga75op06dVK1ac4/A0I07HeAMXwGZWVlYs6cOcLe3l60adNGPPPMMyIhIUEjzub6PVDb/T+K74HGIBHCmMvfEhEREbUcLJdBREREZCSYmBEREREZCSZmREREREaCiRkRERGRkWBiRkRERGQkmJgRERERGQkmZkRERERGgokZERERkZFgYkZE1AwcO3YMvXr1gpmZGV588cXGDoeI6oiJGRE1K1OmTIFEItF4BQcHN3ZoDWr27Nnw8fFBWloavv32W61tBg8erPo8pFIpXFxcMHLkSOzcuVOjrbbPcODAgTo/3+ovIqq7Vo0dABFRfQsODkZERITaNqlU2qDXLCsrg7m5eYNeoyapqamYPn06XF1da2wXGhqKxYsXo7y8HJmZmdi1axfGjRuHKVOm4KuvvlJrGxERoZbQmpubw9TUFJ988olqm5OTk0Y7Iqo79pgRUbMjlUrh6Oio9rK1tVXtl0gk2LhxI1566SVYWlqiS5cu2L17t9o5EhMT8dxzz6F169ZwcHDAa6+9hry8PNX+wYMHIywsDLNnz4adnR2GDRsGANi9eze6dOkCmUyGwMBAbN68GRKJBHfu3EFRURGsra2xY8cOtWvt2bMHVlZWKCws1Ho/paWlmDlzJuzt7WFhYYGBAwfi1KlTAID09HRIJBLcvHkTU6dOhUQi0dljBgCWlpZwdHSEm5sb/P39sXz5cmzYsAFff/01oqOj1dq2bdtW7TNs164dbGxs1LZpa0dEdcfEjIhapEWLFuHVV1/FuXPn8Nxzz2HixIm4desWACA7OxuDBg2Cj48PTp8+jcjISNy4cQOvvvqq2jk2b96MVq1a4dixY9iwYQPS09MxZswYvPjii4iPj8ebb76JDz/8UNXeysoK48aN0+jNi4iIwJgxY9CmTRutsf7zn//Ezz//jM2bNyM2NhZeXl4ICgrCrVu34ObmhuzsbFhbW2PNmjXIzs7G2LFjDfosXn/9ddja2mod0iSiR0wQETUjr7/+ujA1NRVWVlZqr8WLF6vaABDz589Xvb97966QSCRi3759QgghFixYIIYPH6523uvXrwsAIikpSQghxKBBg4SPj49am/fee0/07NlTbduHH34oAIjbt28LIYQ4ceKEMDU1FZmZmUIIIXJzc4WZmZk4cuSI1vu5e/euMDMzEz/88INqW1lZmXB2dhaffvqpapuNjY2IiIio8bMZNGiQmDVrltZ9Tz75pHj22WdV7wEICwsLtc9w165dGscB0LqdiOqGc8yIqNkJDAzEunXr1La1a9dO7f3jjz+u+rOVlRXatGmDnJwcAMCZM2dw+PBhtG7dWuPcqamp6Nq1KwCgT58+avuSkpLQt29ftW39+vXTeN+jRw9s2bIF8+bNw3fffYeOHTvi6aef1novqampKC8vx4ABA1TbzMzM0K9fP1y8eFHrMXUhhNCYuL969Wo888wzqvdOTk71dj0i0o6JGRE1O1ZWVvDy8qqxjZmZmdp7iUQCpVIJAFAqlRg5ciSWL1+ucVz15MTKykptn7bkRgihcY6QkBB88cUXmDdvHiIiIvDGG2/ofJqx6nht562vJyAVCgUuX76skVQ6OjrW+jkSUf3iHDMiogf07t0bFy5cgLu7O7y8vNReDyZj1XXr1k01Kb/K6dOnNdpNmjQJ165dw+eff44LFy7g9ddf13lOLy8vmJub4+jRo6pt5eXlOH36NLp3716Hu9O0efNm3L59Gy+//HK9nI+I6o6JGRE1O6WlpZDL5Wqv6k9U1mbGjBm4desWxo8fj5MnT+LKlSuIiorC1KlToVAodB735ptv4tKlS3jvvfeQnJyMbdu2qZ6QrN67ZWtri9GjR+Pdd9/F8OHDayxxYWVlhbfeegvvvvsuIiMjkZiYiNDQUBQXF2PatGl631OV4uJiyOVyZGRk4MSJE3jvvfcwffp0vPXWWwgMDDT4fERUv5iYEVGzExkZCScnJ7XXwIED9T7e2dkZx44dg0KhQFBQEHr27IlZs2bBxsYGJia6vzY9PDywY8cO7Ny5E48//jjWrVuneirzwTpq06ZNQ1lZGaZOnVprPJ988glefvllvPbaa+jduzdSUlKwf/9+tRIg+vr666/h5OQET09PvPTSS0hMTMRPP/2EL7/80uBzEVH9kwhtEyCIiKheLFmyBOvXr8f169fVtv/www+YNWsWsrKyGrUwLREZF07+JyKqR19++SX69u2L9u3b49ixY1ixYgXCwsJU+4uLi5GWloZly5bhzTffZFJGRGo4lElEVI8uX76MF154Ad7e3vj4448xZ84cLFy4ULX/008/hY+PDxwcHPD+++83XqBEZJQ4lElERERkJNhjRkRERGQkmJgRERERGQkmZkRERERGgokZERERkZFgYkZERERkJJiYERERERkJJmZERERERoKJGREREZGR+H8cxFdDsJVYbgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "plt.scatter(training_systems[\"energies\"], predict[\"energies\"])\n",
    "\n",
    "x_range = np.linspace(plt.xlim()[0], plt.xlim()[1])\n",
    "\n",
    "plt.plot(x_range, x_range, \"r--\", linewidth=0.25)\n",
    "plt.xlabel(\"Energy of DFT\")\n",
    "plt.ylabel(\"Energy predicted by deep potential\")\n",
    "plt.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fffaad23-53a6-47dd-8d91-9beb68d1212b",
   "metadata": {},
   "source": [
    "### Run MD with LAMMPS\n",
    "\n",
    "The model can drive molecular dynamics in LAMMPS. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "d0ceac75-9753-4ae8-b954-c2cc6d005e46",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DeePMD-kit_Tutorial\n",
      "\u001b[01;34m.\u001b[0m\n",
      "├── \u001b[01;32mch4.dump\u001b[0m\n",
      "├── \u001b[01;32mconf.lmp\u001b[0m\n",
      "├── \u001b[01;32mgraph.pb\u001b[0m\n",
      "├── \u001b[01;32min.lammps\u001b[0m\n",
      "└── \u001b[00mlog.lammps\u001b[0m\n",
      "\n",
      "0 directories, 5 files\n"
     ]
    }
   ],
   "source": [
    "! ls\n",
    "! cd ./DeePMD-kit_Tutorial/02.lmp && cp ../01.train.finished/graph.pb ./ && tree -L 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c794572f-7e9c-42f7-b78a-4d82bd3f3118",
   "metadata": {},
   "source": [
    "Here `conf.lmp` gives the initial configuration of a gas phase methane MD simulation, and the file `in.lammps` is the LAMMPS input script. One may check in.lammps and finds that it is a rather standard LAMMPS input file for a MD simulation, with only two exception lines:\n",
    "```\n",
    "pair_style  deepmd graph.pb\n",
    "pair_coeff  * *\n",
    "```\n",
    "where the pair style deepmd is invoked and the model file `graph.pb` is provided, which means the atomic interaction will be computed by the DP model that is stored in the file `graph.pb`. \n",
    "\n",
    "In an environment with a compatibable version of LAMMPS, the deep potential molecular dynamics can be performed via \n",
    "\n",
    "```bash\n",
    "lmp -i input.lammps\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "f4501e9c-541c-431d-8847-d0d9eecfb0e0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LAMMPS (2 Aug 2023 - Update 1)\n",
      "OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)\n",
      "  using 1 OpenMP thread(s) per MPI task\n",
      "Loaded 1 plugins from /root/miniconda3/envs/deepmd/lib/deepmd_lmp\n",
      "Reading data file ...\n",
      "  triclinic box = (0 0 0) to (10.114259 10.263124 10.216793) with tilt (0.036749877 0.13833062 -0.056322169)\n",
      "  1 by 1 by 1 MPI processor grid\n",
      "  reading atoms ...\n",
      "  5 atoms\n",
      "  read_data CPU = 0.002 seconds\n",
      "DeePMD-kit WARNING: Environmental variable OMP_NUM_THREADS is not set. Tune OMP_NUM_THREADS for the best performance. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "Summary of lammps deepmd module ...\n",
      "  >>> Info of deepmd-kit:\n",
      "  installed to:       /root/miniconda3/envs/deepmd\n",
      "  source:             v2.2.7\n",
      "  source branch:       HEAD\n",
      "  source commit:      839f4fe7\n",
      "  source commit at:   2023-10-27 21:10:24 +0800\n",
      "  surpport model ver.:1.1 \n",
      "  build variant:      cpu\n",
      "  build with tf inc:  /root/miniconda3/envs/deepmd/include;/root/miniconda3/envs/deepmd/include\n",
      "  build with tf lib:  /root/miniconda3/envs/deepmd/lib/libtensorflow_cc.so\n",
      "  set tf intra_op_parallelism_threads: 0\n",
      "  set tf inter_op_parallelism_threads: 0\n",
      "  >>> Info of lammps module:\n",
      "  use deepmd-kit at:  /root/miniconda3/envs/deepmdDeePMD-kit WARNING: Environmental variable OMP_NUM_THREADS is not set. Tune OMP_NUM_THREADS for the best performance. See https://deepmd.rtfd.io/parallelism/ for more information.\n",
      "2024-03-24 23:05:49.768736: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE4.1 SSE4.2 AVX AVX2 AVX512F FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
      "2024-03-24 23:05:49.770401: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.\n",
      "2024-03-24 23:05:49.817983: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:354] MLIR V1 optimization pass is not enabled\n",
      "INVALID_ARGUMENT: Tensor spin_attr/ntypes_spin:0, specified in either feed_devices or fetch_devices was not found in the Graph\n",
      "  >>> Info of model(s):\n",
      "  using   1 model(s): graph.pb \n",
      "  rcut in model:      6\n",
      "  ntypes in model:    2\n",
      "\n",
      "CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE\n",
      "\n",
      "Your simulation uses code contributions which should be cited:\n",
      "- USER-DEEPMD package:\n",
      "The log file lists these citations in BibTeX format.\n",
      "\n",
      "CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE\n",
      "\n",
      "Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule\n",
      "Neighbor list info ...\n",
      "  update: every = 10 steps, delay = 0 steps, check = no\n",
      "  max neighbors/atom: 2000, page size: 100000\n",
      "  master list distance cutoff = 7\n",
      "  ghost atom cutoff = 7\n",
      "  binsize = 3.5, bins = 3 3 3\n",
      "  1 neighbor lists, perpetual/occasional/extra = 1 0 0\n",
      "  (1) pair deepmd, perpetual\n",
      "      attributes: full, newton on\n",
      "      pair build: full/bin/atomonly\n",
      "      stencil: full/bin/3d\n",
      "      bin: standard\n",
      "Setting up Verlet run ...\n",
      "  Unit style    : metal\n",
      "  Current step  : 0\n",
      "  Time step     : 0.001\n",
      "Per MPI rank memory allocation (min/avg/max) = 2.559 | 2.559 | 2.559 Mbytes\n",
      "   Step         PotEng         KinEng         TotEng          Temp          Press          Volume    \n",
      "         0  -219.77409      0.025852029   -219.74824      50            -799.80566      1060.5429    \n",
      "       100  -219.77101      0.02250472    -219.7485       43.526023     -563.15562      1060.5429    \n",
      "       200  -219.77525      0.025722761   -219.74953      49.749984     -55.768826      1060.5429    \n",
      "       300  -219.78111      0.030123111   -219.75098      58.260632      415.50143      1060.5429    \n",
      "       400  -219.78545      0.03264184    -219.7528       63.132067      724.77655      1060.5429    \n",
      "       500  -219.7897       0.034591934   -219.75511      66.903712      664.01323      1060.5429    \n",
      "       600  -219.78944      0.031599794   -219.75784      61.116661      307.82983      1060.5429    \n",
      "       700  -219.78389      0.023121639   -219.76076      44.719197     -166.66606      1060.5429    \n",
      "       800  -219.77712      0.013122374   -219.764        25.379775     -493.10259      1060.5429    \n",
      "       900  -219.7791       0.011293959   -219.76781      21.843468     -609.86395      1060.5429    \n",
      "      1000  -219.78712      0.01531002    -219.77181      29.610866     -422.5828       1060.5429    \n",
      "      1100  -219.7939       0.018709632   -219.77519      36.186003     -61.443156      1060.5429    \n",
      "      1200  -219.79395      0.016606919   -219.77734      32.11918       331.62678      1060.5429    \n",
      "      1300  -219.79132      0.012642575   -219.77868      24.451803      505.6361       1060.5429    \n",
      "      1400  -219.79314      0.013255468   -219.77989      25.637191      381.73541      1060.5429    \n",
      "      1500  -219.79509      0.014397006   -219.78069      27.845022      48.696022      1060.5429    \n",
      "      1600  -219.79313      0.012485864   -219.78064      24.148711     -302.67659      1060.5429    \n",
      "      1700  -219.78841      0.0085717658  -219.77983      16.578516     -476.08062      1060.5429    \n",
      "      1800  -219.78663      0.0081557171  -219.77847      15.773843     -407.83792      1060.5429    \n",
      "      1900  -219.78715      0.010996426   -219.77615      21.268013     -98.699573      1060.5429    \n",
      "      2000  -219.78836      0.016278673   -219.77209      31.484324      293.02315      1060.5429    \n",
      "      2100  -219.78819      0.022161035   -219.76603      42.861306      587.40225      1060.5429    \n",
      "      2200  -219.79165      0.031838471   -219.75981      61.578284      543.58893      1060.5429    \n",
      "      2300  -219.79343      0.038239208   -219.75519      73.957846      104.54643      1060.5429    \n",
      "      2400  -219.78301      0.031060153   -219.75195      60.072951     -293.72903      1060.5429    \n",
      "      2500  -219.77209      0.022352657   -219.74974      43.231919     -606.61353      1060.5429    \n",
      "      2600  -219.76604      0.017305685   -219.74873      33.47065      -623.66583      1060.5429    \n",
      "      2700  -219.77552      0.026563069   -219.74895      51.375211     -332.34033      1060.5429    \n",
      "      2800  -219.78594      0.0362724     -219.74967      70.153875      120.73427      1060.5429    \n",
      "      2900  -219.78868      0.038558744   -219.75012      74.575856      542.93567      1060.5429    \n",
      "      3000  -219.78351      0.03281317    -219.75069      63.463433      746.24646      1060.5429    \n",
      "      3100  -219.78106      0.028937414   -219.75212      55.967395      583.87016      1060.5429    \n",
      "      3200  -219.77929      0.025275432   -219.75402      48.884814      128.24387      1060.5429    \n",
      "      3300  -219.77781      0.022017978   -219.75579      42.584622     -395.55332      1060.5429    \n",
      "      3400  -219.77696      0.019305132   -219.75765      37.33775      -679.74745      1060.5429    \n",
      "      3500  -219.78369      0.023714356   -219.75997      45.86556      -656.9891       1060.5429    \n",
      "      3600  -219.79244      0.030071312   -219.76237      58.160448     -354.34542      1060.5429    \n",
      "      3700  -219.79168      0.027557568   -219.76412      53.298657      199.00964      1060.5429    \n",
      "      3800  -219.78639      0.021137515   -219.76525      40.881734      596.54224      1060.5429    \n",
      "      3900  -219.77923      0.012972221   -219.76626      25.089367      713.41996      1060.5429    \n",
      "      4000  -219.78185      0.014202505   -219.76765      27.46884       430.83529      1060.5429    \n",
      "      4100  -219.78477      0.016041208   -219.76872      31.025047     -28.605377      1060.5429    \n",
      "      4200  -219.78545      0.016332231   -219.76912      31.587909     -457.5328       1060.5429    \n",
      "      4300  -219.78602      0.016882726   -219.76914      32.652612     -608.55966      1060.5429    \n",
      "      4400  -219.78949      0.020680419   -219.76881      39.99767      -456.72943      1060.5429    \n",
      "      4500  -219.79121      0.023411938   -219.7678       45.280658     -79.406734      1060.5429    \n",
      "      4600  -219.7882       0.022574198   -219.76562      43.660398      414.11955      1060.5429    \n",
      "      4700  -219.78521      0.022736692   -219.76248      43.974676      663.73939      1060.5429    \n",
      "      4800  -219.7834       0.025050214   -219.75835      48.449222      598.39611      1060.5429    \n",
      "      4900  -219.78291      0.030199797   -219.75271      58.408949      203.75805      1060.5429    \n",
      "      5000  -219.77611      0.030245158   -219.74586      58.496682     -300.80549      1060.5429    \n",
      "Loop time of 38.8363 on 1 procs for 5000 steps with 5 atoms\n",
      "\n",
      "Performance: 11.124 ns/day, 2.158 hours/ns, 128.746 timesteps/s, 643.728 atom-step/s\n",
      "104.3% CPU use with 1 MPI tasks x 1 OpenMP threads\n",
      "\n",
      "MPI task timing breakdown:\n",
      "Section |  min time  |  avg time  |  max time  |%varavg| %total\n",
      "---------------------------------------------------------------\n",
      "Pair    | 38.703     | 38.703     | 38.703     |   0.0 | 99.66\n",
      "Neigh   | 0.0079815  | 0.0079815  | 0.0079815  |   0.0 |  0.02\n",
      "Comm    | 0.0334     | 0.0334     | 0.0334     |   0.0 |  0.09\n",
      "Output  | 0.0065195  | 0.0065195  | 0.0065195  |   0.0 |  0.02\n",
      "Modify  | 0.070599   | 0.070599   | 0.070599   |   0.0 |  0.18\n",
      "Other   |            | 0.01491    |            |       |  0.04\n",
      "\n",
      "Nlocal:              5 ave           5 max           5 min\n",
      "Histogram: 1 0 0 0 0 0 0 0 0 0\n",
      "Nghost:            130 ave         130 max         130 min\n",
      "Histogram: 1 0 0 0 0 0 0 0 0 0\n",
      "Neighs:              0 ave           0 max           0 min\n",
      "Histogram: 1 0 0 0 0 0 0 0 0 0\n",
      "FullNghs:           20 ave          20 max          20 min\n",
      "Histogram: 1 0 0 0 0 0 0 0 0 0\n",
      "\n",
      "Total # of neighbors = 20\n",
      "Ave neighs/atom = 4\n",
      "Neighbor list builds = 500\n",
      "Dangerous builds not checked\n",
      "Total wall time: 0:00:39\n"
     ]
    }
   ],
   "source": [
    "! cd ./DeePMD-kit_Tutorial/02.lmp && lmp -i in.lammps"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
